mockitoテストを実行するとWrongTypeOfReturnValue例外が発生する


94

エラーの詳細:

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);

ご覧のとおり、私は(ではなく)を要求whenupdateItemAttributesています。booleanupdateItemAttributesByJuId

  1. なぜMockitoは返却しようとしているbooleanからupdateItemAttributesByJuId
  2. これをどのように修正できますか?

回答:


190

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メソッドが上記のステートメントで実際に呼び出され、アラウンドアドバイスをトリガーしてaを返すことnullがわかりますが、Mockitoはを期待していList<xxx>ます。
LeOn-Han Li 2016年

私のためにうまくいきました。オブリガード!
サックス奏者

すばらしい答え。それは私の日を救った。
user3198259

40

同様のエラーメッセージのもう1つの理由は、finalメソッドをモックしようとすることです。finalメソッドのモックを試みるべきではありません(Finalメソッドのモックを参照)。

また、マルチスレッドテストでエラーに直面しました。その場合、GNAによる回答が機能しました。


19

非常に関心のある問題。私の場合、この問題は、次のような行でテストをデバッグしようとしたときに発生しました。

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

重要なのは、テストがデバッグなしで正しく実行されていたことです。

いずれにせよ、上記のコードを以下のコードスニペットに置き換えたところ、問題なく問題の行をデバッグできました。

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

おかげで、フィールドとしてのKotlinデータクラスにも同じ問題があり、あなたのソリューションがそれを解決したようです!
Mohsen Mirhoseini、2018

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()いてca.method2()どちらが間違っているのか戻れなかったと私に言ったのです。

修正:(のdoReturn(c).when(b).method1(a)代わりにwhen(b.method1(a)).thenReturn(c);)スタイル構文を使用します。これにより、隠れたバグをより簡潔かつ迅速に発見できます。

または、この特定のケースでは、それを行った後、より正確な「NotAMockException」を表示し始め、モック以外のオブジェクトからの戻り値を設定しようとしないように変更しました。


1
私も同じ間違いをしました。method1で使用されているメソッドをモックして実行すると、この例外が発生しました。そのコードを削除すると解決しました。
Praveen.883

5

最近この問題が発生しました。問題は、私が模倣しようとしていたメソッドにアクセス修飾子がないことでした。publicを追加することで問題は解決しました。


5

私のテストでは、モックとコンクリートタイプの2つの期待があったため、このエラーが発生しました。

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もモックになるように変更して修正しました


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)たとき、それは正しく機能しました。


2

私の場合、Beanは @Autowiredの代わりに注釈を@MockBean

したがって、このようにDAOとサービスをモックすると、そのような例外がスローされます


1
はい、私の場合、Spring-Bootアプリケーションサービステストでは、BeanをモックするときにMockBeanを使用する必要があります。ありがとう!
アイザックフィリップ

1

エラー:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
size()は文字列を返すことができません
size()はintを返す必要 があります
***
上記のエラーが発生する理由が不明な場合は、以下をお読みください。
上記の構文の性質により、上記の問題が発生する可能性があります
。1.この例外、誤って記述されたマルチスレッド
テストで発生する可能性あります。
同時実行テストの制限については、Mockito FAQを参照してください。
2.スパイはwhen(spy.foo())。then()構文を使用してスタブされます。
スパイをスタブする方が安全です
-doReturn | Throw()ファミリーのメソッドを使用します。
Mockito.spy()メソッドの詳細については、javadoc をご覧ください。

実際のコード:

@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

この問題を解決するソリューション:

1番目のアノテーション「@Mock」を削除します。

private ByteString mockByteString;

2番目の追加 PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

1

私は最近、Kotlinデータクラスの関数をモックしているときにこの問題に遭遇しました。なんらかの理由で、私のテスト実行の1つがフリーズした状態になりました。テストを再度実行したところ、以前にパスしたテストの一部がWrongTypeOfReturnValue例外で失敗し始めました。

org.mockito:mockito-inline最終クラス(Arvidaaによる言及)の問題を回避するために使用していることを確認しましたが、問題は残りました。私にとってそれを解決したのは、プロセスを終了してAndroid Studioを再起動することでした。これにより、フリーズしたテスト実行が終了し、次のテスト実行は問題なく成功しました。


1

モックしたいBeanに@MockBeanがありません


1

私のフォーマッターが不足しているインポートを自動的に追加するためWrongTypeOfReturnValuejava.util.Optional;を返すメソッドをモックしたため、この問題が発生しましたcom.google.common.base.Optional;

Mockitoは「method something()はOptionalを返す必要がある」と私に言っていました...


1

私にとっての問題は、共有モックでスタブ/検証を行っていたマルチスレッドテストでした。これにより、ランダムにWrongTypeOfReturnValue例外がスローされていました。

これは、Mockitoを使用して適切に記述されたテストではありません。モックは複数のスレッドからアクセスしないでください。

解決策は、各テストのモックをローカルにすることでした。


1

TL; DRテストの一部の引数がである場合はnull、のisNull()代わりに必ずパラメータ呼び出しをモックしてくださいanyXXX()


Spring boot 1.5.xから2.1.xにアップグレードすると、このエラーが発生しました。Spring bootには独自のMockitoが同梱されており、これも2.xにアップグレードされています(たとえば、Dependencies of Spring boot 2.1.2を参照)。

Mockitoは、のために行動を変更したanyXXX()方法、XXXであるStringLongここでなど、javadocツールのですanyLong()

Mockito 2.1.0以来、唯一の価値許可しLong、これ null有効な値は、プリミティブラッパーがNULL可能であるため、提案APIをすることはもうない一致 nullラッパーは次のようになります#isNull()。この変更により、Mockito 1.xの場合よりもテストのハーネスがはるかに安全になると感じました。

少なくとも1つの引数がであるかどうか、モックが呼び出されて検査されるところまでデバッグすることをお勧めします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.