mockito 테스트를 실행할 때 WrongTypeOfReturnValue Exception이 발생합니다.


96

오류 세부 정보 :

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.

내 코드 :

@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;

when(arrangeManagerSpy
    .updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
    .thenReturn(false);

보시다시피, 나는 whenon이 아닌 ( updateItemAttributesa를 반환하는 boolean) 호출 하고 updateItemAttributesByJuId있습니다.

  1. Mockito가 boolean에서 를 반환하려고하는 이유는 무엇 updateItemAttributesByJuId입니까?
  2. 이 문제를 어떻게 해결할 수 있습니까?

답변:


198

에 따르면 https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90 , 당신은 바꿔해야 당신의

when(bar.getFoo()).thenReturn(fooBar)

...에

doReturn(fooBar).when(bar).getFoo()

3
이것은 훌륭한 팁입니다. @Aspect로 일부 Spring @RepositoryDAO 메서드를 테스트 할 때도이 문제가 발생했습니다 . 그렇게하면 when(someDao.someMethod()).thenReturn(List<xxx>)이 WrongTypeOfReturnValue 예외가 발생합니다. 디버그를 통해 someMethod메서드가 실제로 위의 문에서 호출되고 Around Advice를 트리거하고 A를 반환 null하지만 Mockito는 List<xxx>.
LeOn-Han Li

나를 위해 운동했습니다. Obrigado!
색소폰 연주자

훌륭한 답변입니다. 내 하루를 구했습니다.
user3198259

나를 위해 일했습니다! 감사! 그러나 제공된 링크의 설명을 완전히 이해하지 못했습니다.
georgeliatsos

40

유사한 오류 메시지에 대한 또 다른 이유는 final메서드 를 모의하려는 것입니다. 최종 메소드를 모의해서는 안됩니다 ( Final method mocking 참조 ).

또한 다중 스레드 테스트에서 오류에 직면했습니다. 그 경우에 gna의 답변이 작동했습니다.


20

매우 흥미로운 문제입니다. 제 경우에는이 비슷한 줄에서 테스트를 디버깅하려고 할 때이 문제가 발생했습니다.

Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);

중요한 점은 테스트가 디버깅없이 올바르게 실행되었다는 것입니다.

어떤 식 으로든 위 코드를 아래 코드 스 니펫으로 교체하면 문제없이 문제 줄을 디버깅 할 수있었습니다.

doReturn(fooBar).when(bar).getFoo();

감사합니다. Kotlin 데이터 클래스에 필드와 동일한 문제가있는 것 같습니다. 솔루션이 문제를 해결했습니다.
Mohsen Mirhoseini

6

나를 위해 이것은 내가 이것을 실행하고 있음을 의미합니다.

a = Mockito.mock(SomeClass.class);
b = new RealClass();
when(b.method1(a)).thenReturn(c); 
// within this method1, it calls param1.method2() -- note, b is not a spy or mock

무슨 무슨 일이 벌어지고 것은 그래서 mockito 그 감지 된 a.method2()호출되는 한, 나는 반환하지 수 말해 c에서a.method2() 하는 잘못된 것입니다.

수정 : doReturn(c).when(b).method1(a)스타일 구문 사용 (대신when(b.method1(a)).thenReturn(c); 숨겨진 버그를보다 간결하고 빠르게 발견하는 데 도움이되는 )을 .

또는이 특정 경우에는 더 정확한 "NotAMockException"이 표시되기 시작했고 더 이상 모의 객체가 아닌 객체에서 반환 값을 설정하지 않도록 변경했습니다.


1
저도 같은 실수를했습니다. method1에서 사용 된 메서드를 조롱하고 실행하여이 예외가 발생했습니다. 해당 코드를 제거하면 해결되었습니다.
Praveen.883

5

최근에이 문제가 발생했습니다. 문제는 내가 모의하려는 방법에 액세스 수정자가 없다는 것입니다. 대중을 추가하면 문제가 해결되었습니다.


5

테스트에서 두 가지 기대치가 있었기 때문에이 오류가 발생했습니다.

MyClass cls = new MyClass();
MyClass cls2 = Mockito.mock(Myclass.class);
when(foo.bar(cls)).thenReturn(); // cls is not actually a mock
when(foo.baz(cls2)).thenReturn();

cls를 mock으로 변경하여 수정했습니다.


4

제 경우에는 정적 메서드를 조롱 mockStatic하고 클래스 를 호출 하는 것을 잊었 기 때문에 문제가 발생했습니다 . 또한 클래스를 포함하는 것을 잊었습니다.@PrepareForTest()


2

주석을 사용하는 경우 @InjectMocks 대신 @Mock을 사용해야 할 수 있습니다. @InjectMocks는 @Spy와 @Mock으로 함께 작동하기 때문입니다. 그리고 @Spy는 최근에 실행 된 메서드를 추적하고 잘못된 데이터가 반환 / 서브 베드되는 것을 느낄 수 있습니다.


2
" @InjectMocks로 작동 @Spy@Mock함께." <-그것은 나에게 잘못된 것 같습니다. 이 소식을 어디서 들었습니까?
Etienne Miret

2

제 경우에는 @RunWith(MockitoJUnitRunner.class)MockitoAnnotations.initMocks(this). 제거했을 때 MockitoAnnotations.initMocks(this)제대로 작동했습니다.


1

오류:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue :
size ()에 의해 문자열을 반환 할 수 없습니다.
size ()는 int를 반환해야합니다.
***
위의 오류를 읽는 이유가 확실하지 않은 경우.
위 구문의 특성으로 인해 다음과 같은 이유로 문제가 발생할 수 있습니다.
1.이 예외 잘못 작성된 다중 스레드
테스트 에서 발생할 있습니다 .
동시성 테스트의 한계에 대해서는 Mockito FAQ를 참조하십시오.
2. 스파이는 when (spy.foo ()). then () 구문을 사용하여 스텁됩니다. doReturn | Throw () 계열의 메서드를 사용하여
스파이 를 스텁하는 것이 더 안전
합니다.
Mockito.spy () 메서드에 대한 javadocs에서 더 많이 .

실제 코드 :

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Object.class, ByteString.class})

@Mock
private ByteString mockByteString;

String testData = “dsfgdshf”;
PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData); 
// throws above given exception

이 문제를 해결하기위한 솔루션 :

1st "@Mock"주석을 제거합니다.

private ByteString mockByteString;

두 번째 추가 PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

1

최근 Kotlin 데이터 클래스 에서 함수를 조롱하는 동안이 문제가 발생했습니다 . 알 수없는 이유로 테스트 실행 중 하나가 중지 된 상태가되었습니다. 테스트를 다시 실행했을 때 이전에 통과 한 일부 테스트가 WrongTypeOfReturnValue예외 와 함께 실패하기 시작했습니다 .

org.mockito:mockito-inline최종 수업 (Arvidaa에서 언급)과 관련된 문제를 피하기 위해 사용 하고 있음을 확인했지만 문제는 계속 남아 있습니다. 나를 위해 해결 한 것은 프로세스를 종료하고 Android Studio를 다시 시작하는 것이 었습니다 . 이로 인해 내 고정 테스트 실행이 종료되고 다음 테스트 실행이 문제없이 통과되었습니다.


1

조롱하려는 빈에 @MockBean이 없습니다.


1

내 포맷터가 누락 된 가져 오기를 자동으로 추가 하기 때문에 WrongTypeOfReturnValuea java.util.Optional;를 반환하는 메서드를 조롱했기 때문에이 문제 가 com.google.common.base.Optional;발생했습니다.

Mockito는 "method something () should return Optional"이라고 말하고있었습니다.


1

제 경우에는 빈이 @MockBean 대신 @Autowired 주석을 사용하여 초기화되었습니다.

따라서 이러한 방식으로 DAO 및 서비스를 조롱하면 이러한 예외가 발생합니다.


1
예, 제 경우에는 Spring-Boot 애플리케이션 서비스 테스트에서 MockBean을 사용하여 Bean을 조롱해야합니다. 감사!
Isaac Philip

1

나에게 문제는 공유 모의에서 스터 빙 / 검증을 수행하는 다중 스레드 테스트였습니다. 무작위로 WrongTypeOfReturnValue예외가 발생했습니다.

이것은 Mockito를 사용하여 올바르게 작성된 테스트가 아닙니다. 모의는 여러 스레드에서 액세스해서는 안됩니다.

해결책은 모의를 각 테스트에 로컬로 만드는 것이 었습니다.


1

TL; DR 테스트의 일부 인수가 인 경우 대신 null매개 변수 호출을 모의 처리해야합니다 .isNull()anyXXX()


Spring boot 1.5.x에서 2.1.x로 업그레이드 할 때이 오류가 발생했습니다. 스프링 부트는 자체 Mockito와 함께 제공되며, 이제 2.x로 업그레이드됩니다 (예 : 스프링 부트 2.1.2의 종속성 참조 ).

Mockito는 위해 동작을 변경 anyXXX()하는 방법 XXX이며 String, Long여기서, 등의 자바 독이다 anyLong():

Mockito 2.1.0 이후에만 가치를 허용 Long, 따라서 null유효한 값은 원시 래퍼가 널 (NULL)으로, 제안 된 API가 더 이상 아니다 일치 null 래퍼가 될 것이다 #isNull(). 우리는 이러한 변화가 Mockito 1.x보다 훨씬 더 안전한 테스트를 가능하게 할 것이라고 생각했습니다.

모의가 호출 될 지점까지 디버그 하고 적어도 하나의 인수가 null. 이 경우 isNull()예를 들어 대신 모의를 준비하십시오 anyLong().

그래서 이건:

when(MockedClass.method(anyString());

된다 :

when(MockedClass.method(isNull());

-1

이것은 내 경우입니다.

//given
ObjectA a = new ObjectA();
ObjectB b = mock(ObjectB.class);
when(b.call()).thenReturn(a);

Target target = spy(new Target());
doReturn(b).when(target).method1();

//when
String result = target.method2();

그런 다음이 오류가 발생합니다.

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2()
method2() should return String

당신은 추측 할 수?

문제는 Target.method1 ()이 정적 메서드라는 것입니다. Mockito는 다른 것에 대해 완전히 경고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.