2014-11-20 3 views
0

MAS 용 Unittest를 작성하려고합니다. 그러므로 나는 에이전트가 통신하고있는 에이전트를 조롱해야한다. 다음은 내가 지금하려고하는 일의 예입니다. 제가 테스트하고 싶은 에이전트 A가 있습니다. 그는 다른 에이전트 B에게 B.method (arg)를 호출하는데, 이는 내 경우에 조롱을 받는다. 일반적으로 B는 A.method (arg1, arg2, arg3)를 호출합니다. 나는 Mockito를 처음 접했고 그 가능성에 대해 많이 알지 못합니다. (mock.method) .thenCall (A.method)과 같은 것을 할 수 있습니까?Mockito로 메소드 호출을 모의하는 방법

도움 주셔서 감사합니다.

+0

당신이 테스트 할 일에 대해 정말 분명처럼은 보이지 않는다. B를 호출 할 때 A도 실제로 호출되는지 확인 하시겠습니까? – fge

+0

당신은 그것을하지 말아야한다.'B'가'A'를 호출하도록 강요하는 디자인이다. (괜찮은 일이지만 그것을 시행하는 것은 잘못이다.)'B'가'A'를 호출한다는 사실은 'A'가 아니라'B'의 대원들에게 시험해 봅니다. – amit

+0

확실히 Mockito의'Answer' 기능을 사용하여 가능합니다. 설명서를 확인하십시오. 그러나 이러한 두 클래스 간의 순환 의존성은 거의 확실하게 잘못된 설계를 나타냅니다. 수업이 서로 관련되는 방식을 다시 생각해 보시기 바랍니다. 그리고 아무도'Answer' 기능을 사용하여 답변을 게시하지 않으면 나중에 할 것입니다. –

답변

0

메소드 호출을 조롱하는 의도는 메소드가 mock 인스턴스에서 호출 될 때 즉시 값을 리턴하거나 예외를 throw하는 것입니다. 이 클래스를 사용하면 해당 클래스의 공동 작업자를 호출하지 않고도 테스트중인 클래스를 사용할 수 있습니다.

따라서 메서드 호출을 다른 메서드 호출로 위임하는 대신 보통 thenResult(someValue) 또는 thenThrow(someException)이됩니다.

someValue을 유도하는 도우미 테스트에 의존 할 수도 있지만 유용한 테스트는 아닙니다.

0

당신은 그것을하지 말아야, 그것은 A 전화를 B을 적용 할 나쁜 디자인이다 (그것은 그것을 할 괜찮지 만, 그것은 잘못 적용), BA를 호출한다는 사실은 B 년대에 테스트해야 unitests가 아니며 A이 아니며 A은이를 인식하지 않아야합니다.

당신은 다른 한편으로는, B.method() 호출 (얼마나 많은 시간을, 어느 인수), 또는 다른 좋은 unitest가 A, 호출하지 않고 B.method()에서 스텁 값을 반환 할 것을 Mockito로 확인할 수 있습니다 - 그 이후를 A의 단일 동작을 확인합니다. (A.method()에 대한 전화는 별도로 테스트해야합니다.) Mockito와 스텁 값을 반환 예를 들어

쉽게 Mockito's javadocs

0

파티에 조금 늦게에서 찾을 수 있습니다

Mockito.when(mockedB.method(SOME_ARG_HERE)).thenReturn(SOME_RESULT); 

훨씬 더 유용한 예제와 정보를 완료,하지만 난 것이라고 생각 대답으로 원했던 것을 성취 할 수 있어야합니다.

다음은 모의 방법 (methodOnB)가 호출 될 때마다 진짜 방법 (methodOnA)를 호출합니다 :

doAnswer(new Answer<Void>() { 
    @Override 
    public Void answer(InvocationOnMock invocationOnMock) throws Throwable { 
     realObjectA.methodOnA() 
     return null; 
    } 
}).when(mockObjectB).methodOnB(); 
관련 문제