CashTest
와 같이 테스트 네이밍을 하지만 이상적이지 않다고 주장한다.주석도 쓰지 마라
누구나 코드를 보고 이해할 수 있도록 코드를 작성하라
Exchange exchange = Mockto.mock(Exchange.class);
Mockito.doReturn(1.1.5)
.when(exchange)
.rate("USD","EUR");
Cash
가 Exchage.rate()
를 호출한다고 가정한다.모의 객체는 블랙박스를 가지고 가정을 사실로 바꾸기에 너무 쉽게 깨지고 불안정하다. 따라서 페이크 객체를 쓰라고 추천한다.
import java.util.ArrayList;
import java.util.List;
public interface Exchange {
float rate(String target);
float rate(String origin, String target);
final class Fake implements Exchange{
@Override
public float rate(String target) {
return this.rate("USD", target);
}
@Override
public float rate(String origin, String target) {
return 1.2345f;
}
}
default List<Float> fakeTest(String origin, String target){
List<Float> result = new ArrayList<>();
result.add(this.rate(target));
result.add(this.rate(origin, target));
return result;
}
}
모의 객체 대신 페이크 객체를 쓰자. 굉장히 새로운 관점이다.
인터페이스를 작게 유지하라. 그러기 위해 1,2개의 메서드에 집중하고 그러기 위해 공용적으로 사용되는 코드를 samrt 를 통해 활용해라. 이것도 꽤나 흥미로운 주제인데, interface 의 책임에 적합한가라고 하면 솔직히 잘 모르겠다... 내가 너무 정형화된 사용에 맞춰버린걸수도 있지만... 객체지향적으로 타입을 지정하는 인터페이스에 공용으로 사용될수 있는 메서드를 정해버리면 유연성 확보나 코드 수정에 있어 스마트 객체도 변경이 필요할 것이다. 그렇다면 interface 를 순수하게 쓰는 것은 아니라고 생각한다. 나는 interface 는 타입을 지정하는 용도로만 쓰고 싶다.
public interface Exchange {
float rate(String origin, String target);
final class Smart {
private final Exchange origin; // 컴파일 에러 발생
public float toUsd(String source){
return this.origin.rate(source, "USD");
}
}
}