2015-01-07 5 views
0

내가반환 문자열 값 때()

@Mock Individual indProvider; 
when(indProvider.asProvider().getProviderId()).thenReturn("795316051750"); 

같은 경우() 메소드를 사용하여 mockito에 특정 문자열 값에 노력하고 있어요하지만 내가 돌아갈 수 어떻게 예외

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
0 matchers expected, 1 recorded. 
This exception may occur if matchers are combined with raw values: 
//incorrect: 
someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
//correct: 
someMethod(anyObject(), eq("String by matcher")); 

For more info see javadoc for Matchers class. 

무엇입니까 이 경우 특정 문자열?

답변

3

mockito 매처는 스텁 호출 또는 확인 호출의 외부에서 사용.

코드베이스에서 JUnit을 사용하는 경우 mockito 러너를 사용하는 것이 좋으며 각 테스트 방법에 대한 mockito 사용이 유효하다는 것을 의미합니다. 즉, 모든 문제가 잘못 작성된 테스트에 정확히 표시 될 수 있습니다.

@RunWith(MockitoJUnitRunner.class) 
public class TheTest { 
    @Test public void shoudl_perform_something() { ... } 
} 

또는 (1.10.17부터)은 mockito 규칙 당신은 사용할 필요가 없습니다

public class TheTest { 
    @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); 
    @Test public void should_perform_something() { ... } 
} 

는이 프레임 워크 검증의 혜택을 테스트에 @Mock의가 있습니다. 어쨌든 모두 MockitoAnnotations.initMocks(...)

또한

사용하는 mockito 버전에 비해 모의 객체를 인스턴스화하는 선호 방법입니다? 나는 Mockito가 나쁜 코드의 위치에 대한 메시지를 개선했다고 믿는다. mockito이 null 인 디폴트 값을 사용할 수 있도록 indProvider.asProvider()이 스텁되지 않기 때문에이 코드가 제대로 작동하지 않을 수


참고. 당신은이 방법 중 하나를 수행해야합니다 (깊은 스텁 레거시 코드를 여기에, 모의를 반환 모의은 일반적으로 코드 냄새 간주되며 그것은 테스트 코드가 Law of Demeter 나누기 방송) :

@Mock(answer = RETURNS_DEEP_STUBS) Individual indProvider; 
// ... 
when(indProvider.asProvider().getProviderId()).thenReturn("795316051750"); 

또는 @ 응답으로 przemek, 그것은 더 장황하고 테스트 코드에서 동일한 약점을 보여줍니다.


@Mock(answer = RETURNS_DEEP_STUBS) Individual indProvider; 
@Mock Provider provider; 
// ... 
when(indProvider.asProvider()).thenReturn(provider); 
when(provider.getProviderId()).thenReturn("795316051750"); 

나는이 책 ( Growing Object Oriented Software Guided by Tests), 당신이 시험에 의해 인도 소프트웨어 작성에 대한 읽을 수있는 최고의 책 중 하나를 읽고 조언한다. 나는 악명 높은 Effective Java book보다 훨씬 더 중요하다고 생각한다.

1

당신은 사용해야 여러 when() 가로 채기 : 코드에서 아마 어딘가에있다

@Mock Individual indProvider; 
@Mock Provider provider; 

when(indProvider.asProvider()).thenReturn(provider); 
when(provider.getProviderId()).thenReturn("795316051750"); 
+0

나는 아직도 동일한 예외를 준다. –

+0

이 답변은 저에게 상당히 합리적입니다. 오류가 matchers와 원시 값을 혼합하는 다른 테스트 코드에 대해보고되는지 궁금합니다. 종종 오류 메시지가 도움이 될 수 있으며 질문에 적용되지 않는 세부 정보를 제공합니다. 개인적으로 나는 Mockito에게 JMockit을 선호합니다. – unigeek