세바스티앙 :
나는 시험에 노력하고 있음을 여기에이 코드를 가지고 :
public class Something {
public String doSomething(MyClass myClass) {
return Utils.getPresentationString(myClass)
}
}
public class Utils{
public static String getPresentationString(MyClass myClass) {
if (myClass instanceof MySubClass) {
MySubClass mySubClass = (MySubClass) myClass;
return mySubClass.getMaskedPresentationString();
} else {
return myClass.getPresentationString();
}
}
}
의 Utils 정적이기 때문에 뭔가 클래스를 테스트하는 동안, 나는 블랙 박스 방식을 테스트입니다.
나는 코드를 반환 모의의이 라인을 가지고 노력하고 있습니다 :
MySubClass mySubClass = (MySubClass) myClass;
나는 할 수 있도록
doReturn(MY_MASKED_STRING).when(this.mySubClassMock).getMaskedPresentationString()
다음 할
assertEquals(MY_MASKED_STRING, this.somethingUnderTest.doSomething(this.myClassMock))
나는이 작품 같은 것을 어떻게
doReturn(this.mySubClassMock).when(this.myClassMock).<<cast to MySubClass.class>>
GhostCat 경례 모니카 C. :
라인이 캐스팅 즉, 이미이없는 것을 반환 할 수 없습니다. 하지만.
public static String getPresentationString(MyClass myClass) {
if (myClass instanceof MySubClass) {
그것은 단순히 클래스로 오는 객체입니다.
따라서 당신은 단순히 필요 :
MySubClass subclassMock = mock(MySubClass.class);
...
objectUnderTest.getPresentationString(subclassMock);
그리고 생산 코드 기꺼이 "그것의 인스턴스입니다"하고 당신이 들어오는 개체를 완벽하게 제어를 제공 캐스트 가야한다.
그러나 참고 : "진짜"OOP의 여기 방법 :하지 않는 것이 instanceof를 / 캐스트!
return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()
당신의 서브 클래스가없는 이유는 우선 getPresentationString()
, 다른 값을 반환하는? 그 잘못 될 경우, 다음 두 가지 구현을 가지고 몇 가지 "기본"추상적 인 방법을 가질 수있을 것입니다!
긴 이야기를 짧게 :
- 직접 답은 간단하거나 뭔가를 전달
mock(MyClass.class)
하거나mock(MySubClass.class)
당신이 테스트하고자하는 경로에 따라, - 하지만 훨씬 더 : 아예 그 instanceof를 / 캐스트 부분을 없애. 좋은 OOP의 요점은 정확히 같은 코드를 방지하는 것입니다!