2013-02-21 2 views
0

void 메서드를 테스트하고 해당 종속성이 전달 된 참조의 상태를 변경할 때 종속성을 조롱하는 데 문제가 있습니다. 나는 부작용이 void 메쏘드에서 관찰 될 수 있고 행동 또한 관찰 될 수 있음을 이해하지만 이러한 지침을이 코드에 적용하는 데 어려움을 겪고 있습니다. 비슷한 질문이 있지만 상태에 대한 후속 로컬 변경 사항을 처리 할 수있는 항목을 찾을 수 없습니다. 나는 JUnit을 이용하고 있고 Mockito는 ... 저는 여기에 대해서 이야기하고있는 코드의 인위적인 버전입니다 : 나는 MergingObject 개체에 대한 모의를 만들 경우 여기유닛 테스팅 무효 메서드와 후속 작업으로 상태가 변경되는 종속성

@Mock 
MergingObject mergingObject; 

@Override 
public void process(Foo foo1) { 
    Foo foo2 = getAnInstanceOfFoo(); // private 
    Foo foo3 = mergingObject.merge(foo1, foo2); // public 
    foo1.copySomeValues(foo3); 
} 

수수께끼입니다. merge (...) 연산이 결코 호출되지 않기 때문에 우리가 객체를 조롱하면 사라질 것으로 예상되는 상태 변화가 사라집니다. 병합 (...)이 foo1과 foo2의 올바른 인스턴스로 호출되었지만 후속 copySomeValues ​​(...) 호출이 여전히 NullPointerException을 throw하는지 확인할 수 있습니다.

제안 사항?

+1

잘 모의 개체에 병합을 구현할 수 있습니다! exacly 분명하지만, 당신은 병합 변경 foo1 및/또는 foo2 당신을 말하지 않습니다? –

+0

내가 그렇게 할 수 있다면 꽤 흥미 롭다. 이 경우 병합은 foo1 및 foo2의 내용을 기반으로 새 인스턴스를 반환합니다. 이를 위해서는 후속 "복사"단계가 필요합니다. –

+0

1 분 동안 부작용을 테스트하고 있다고 생각했습니다. 나는 그 문제를 푸는 키스 태도를 가지고 부작용을 제거합니다. –

답변

3

내가 오해하지 않는 한, mergingObject를 모의로 설정하고 있지만 모의 동작을 설정하지 않은 것입니다. 당신은 mocked mergingObject에게 .merge가 호출 될 때, 뭔가를 반환한다고 알려줄 필요가있다. 이 무언가는 여러분이 좋아할만한 것이 될 수 있으며 process()에서 반환 된 객체가 동일한 객체인지 확인할 수 있습니다.

mockito에서 스텁 구문으로 동작을 설정할 수 있습니다. 내가 현장에서 mockito하지만보고를 사용한 적이 그들이 당신의 foo1은과에서는 foo2

+0

무슨 뜻인지 알 겠어. 이제 병합 (...)에서 Foo의 다른 인스턴스를 반환하면 물론 getAnInstanceOfFoo (...) 호출에서 변경 사항을 제거합니다. 그래서 내가 병합 (...) 호출이 예상 된 개체와 있는지 확인하고 copyValues ​​(...) 메서드에 대한 어설 션이 필요하다는 것을 확인하는 단계가 필요합니다 (현재 내 조롱 된 반환 개체 사용). 해당 메소드가 상태를 올바르게 변경하는지 확인하십시오. –

0

일치 있도록 forsomething과 뭔가 다른 인수를 지정하는 방법 당신이 조심해야이

when(mergingObject.merge(something, somethingelse).return(new Foo()); 

같은 뭔가 내가 게시 한 내용에서 발견 한 사실은 테스트중인 내용과 그 이유가 명확하지 않다는 것입니다.

주어진 병합이 자신의 테스트 집합이 될 다른 클래스에 위임되었습니다. CopySomeValues를 테스트하기 위해 foo1과 foo3을 만들었을 것입니다. 병합은 전혀 기능하지 않습니다.