web-dev-qa-db-ja.com

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

エラーの詳細:

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

ご覧のとおり、whenではなくupdateItemAttributesbooleanを返す)でupdateItemAttributesByJuIdを呼び出しています。

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

https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy9 によると、

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

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

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

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

32
Arvidaa

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

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

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

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

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

私は最近この問題を抱えていました。問題は、私がモックしようとしたメソッドにアクセス修飾子がないことでした。パブリックを追加することで問題は解決しました。

4
not_john

私のテストでは、モックとコンクリートタイプの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もモックになるように変更して修正しました

3
Tzafrir

私の場合、静的メソッドをモックしようとして、クラスでmockStaticを呼び出すのを忘れたことが問題の原因でした。また、クラスを@PrepareForTest()に含めるのを忘れました

3
ACV

注釈を使用している場合、@ InjectMocksの代わりに@Mockを使用する必要があるかもしれません。 @InjectMocksは@Spyと@Mockとして一緒に機能するためです。また、@ Spyは最近実行されたメソッドを追跡しているため、誤ったデータが返されたりサブブされたりする場合があります。

1
dillip pattnaik

私にとって、これは私がこれを実行していたことを意味しました:

_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()が呼び出されていることを検出し、a.method2()からcを返すことができなかったことを教えてくれました。

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

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

1
rogerdpack

ToString()メソッドの問題が原因でIntelliJでデバッグするときにテストが失敗するが、デバッグしないときには合格するという同様の問題がありました。 @gnaからの回答を使用することはできましたが、私の場合はthenReturnメソッドで新しいオブジェクトを作成するのではなく、変数を渡すことでも問題を修正しました。

だから変換

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

に:

FooBar fooBar = new FooBar();
when(bar.getFoo()).thenReturn(fooBar);

問題を修正しました。

0
Grant Lay

私の場合、@RunWith(MockitoJUnitRunner.class)MockitoAnnotations.initMocks(this)の両方を使用していました。 MockitoAnnotations.initMocks(this)を削除すると、正常に機能しました。

0
ihebiheb

エラー:

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

実際のコード:

@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

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

最初の注釈「@Mock」を削除します。

private ByteString mockByteString;

2番目の追加PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

モックするBeanに@MockBeanがない

0
buddha

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

最終クラス(Arvidaaによる)の問題を回避するためにorg.mockito:mockito-inlineを使用していることを確認しましたが、問題は残りました。私にとってそれを解決したのは、プロセスを強制終了して、Android Studioを再起動したことです。

0
simonevertsson

これは私の場合です:

//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は別のことを完全に警告します。

0