주조 작업에서 모의 반환, Mockito, 자바

세바스티앙 :

나는 시험에 노력하고 있음을 여기에이 코드를 가지고 :

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의 요점은 정확히 같은 코드를 방지하는 것입니다!

추천

출처http://43.154.161.224:23101/article/api/json?id=315984&siteId=1