Detail kesalahan:
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.
kode saya:
@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;
when(arrangeManagerSpy
.updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
.thenReturn(false);
Seperti yang Anda lihat, saya menelepon when
pada updateItemAttributes
(yang tidak kembalinya boolean
) tidak di updateItemAttributesByJuId
.
- Mengapa Mockito mencoba mengembalikan
boolean
dariupdateItemAttributesByJuId
? - Bagaimana ini bisa diperbaiki?
@Repository
metode Spring DAO dengan @Aspect . jika yawhen(someDao.someMethod()).thenReturn(List<xxx>)
, saya mendapat pengecualian WrongTypeOfReturnValue ini. Melalui debug, saya dapat melihat bahwasomeMethod
metode ini sebenarnya dipanggil dalam pernyataan di atas dan memicu Sekitar Advice dan mengembalikannull
tetapi Mockito mengharapkanList<xxx>
.Alasan lain untuk pesan kesalahan serupa adalah mencoba meniru
final
metode. Seseorang tidak boleh mencoba untuk mengejek metode akhir (lihat mengejek metode terakhir ).Saya juga menghadapi kesalahan dalam tes multi-threaded. Jawaban oleh gna bekerja dalam kasus itu.
sumber
Masalah yang sangat menarik. Dalam kasus saya, masalah ini terjadi ketika saya mencoba men-debug pengujian saya pada baris serupa ini:
Catatan penting adalah bahwa pengujian berjalan dengan benar tanpa debugging.
Bagaimanapun, ketika saya mengganti kode di atas dengan potongan kode di bawah ini maka saya dapat men-debug baris masalah tanpa masalah.
sumber
Bagi saya ini berarti saya menjalankan ini:
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
Jadi yang terjadi adalah mockito itu mendeteksi yang
a.method2()
dipanggil, dan memberi tahu saya bahwa saya tidak bisa kembalic
daria.method2()
mana yang salah.Perbaiki: gunakan
doReturn(c).when(b).method1(a)
sintaks gaya (bukanwhen(b.method1(a)).thenReturn(c);
), yang akan membantu Anda menemukan bug tersembunyi dengan lebih ringkas dan cepat.Atau dalam kasus khusus ini, setelah melakukan itu mulai menampilkan "NotAMockException" yang lebih akurat, dan saya mengubahnya untuk tidak lagi mencoba menetapkan nilai kembali dari objek non-tiruan.
sumber
Saya baru saja mengalami masalah ini. Masalahnya adalah metode yang saya coba tiru tidak memiliki pengubah akses. Menambahkan publik memecahkan masalah.
sumber
Saya mengalami kesalahan ini karena dalam pengujian saya, saya memiliki dua harapan, satu pada tiruan dan satu lagi pada tipe konkret
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();
Saya memperbaikinya dengan mengubah cls menjadi tiruan juga
sumber
Dalam kasus saya, masalahnya disebabkan oleh mencoba mengejek metode statis dan lupa memanggil
mockStatic
kelas. Juga saya lupa memasukkan kelas ke dalam@PrepareForTest()
sumber
Jika Anda menggunakan anotasi, mungkin Anda perlu menggunakan @Mock daripada @InjectMocks. Karena @InjectMocks berfungsi sebagai @Spy dan @Mock bersama-sama. Dan @Spy melacak metode yang baru saja dieksekusi dan Anda mungkin merasa bahwa data yang salah dikembalikan / diganti teksnya.
sumber
@InjectMocks
bekerja sebagai@Spy
dan@Mock
bersama - sama." <- menurutku itu salah. Dari mana Anda mendengar ini?Dalam kasus saya, saya menggunakan keduanya
@RunWith(MockitoJUnitRunner.class)
danMockitoAnnotations.initMocks(this)
. Ketika saya menghapusnyaMockitoAnnotations.initMocks(this)
bekerja dengan benar.sumber
Kesalahan:
Kode Aktual:
@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
Solusi untuk memperbaiki masalah ini:
1 Hapus anotasi “@Mock”.
private ByteString mockByteString;
2 Tambahkan
PowerMockito.mock
sumber
Saya baru-baru ini mengalami masalah ini saat mengejek fungsi di kelas data Kotlin . Untuk beberapa alasan yang tidak diketahui, salah satu pengujian saya berakhir dalam keadaan beku. Ketika saya menjalankan tes lagi, beberapa tes saya yang sebelumnya lulus mulai gagal dengan
WrongTypeOfReturnValue
pengecualian.Saya memastikan saya menggunakan
org.mockito:mockito-inline
untuk menghindari masalah dengan kelas terakhir (disebutkan oleh Arvidaa), tetapi masalahnya tetap ada. Apa yang memecahkannya bagi saya adalah menghentikan proses dan memulai ulang Android Studio . Ini menghentikan pengujian saya yang beku dan pengujian berikut berjalan tanpa masalah.sumber
@MockBean tidak ada pada kacang yang ingin Anda ejek
sumber
Saya mendapat masalah ini
WrongTypeOfReturnValue
karena saya mengejek metode yang mengembalikanjava.util.Optional;
dengancom.google.common.base.Optional;
karena formatter saya secara otomatis menambahkan impor yang hilang.Mockito baru saja mengatakan kepada saya bahwa "metode sesuatu () harus mengembalikan Opsional" ...
sumber
Dalam kasus saya, kacang telah diinisialisasi menggunakan anotasi @Autowired alih-alih @MockBean
Jadi dengan cara ini, mengejek DAO dan Layanan membuat pengecualian tersebut
sumber
Bagi saya masalahnya adalah tes multithread yang melakukan stubbing / verifikasi pada ejekan bersama. Itu mengarah pada
WrongTypeOfReturnValue
pengecualian melempar secara acak .Ini bukan tes tertulis dengan benar menggunakan Mockito. Tiruan tidak boleh diakses dari beberapa utas.
Solusinya adalah membuat olok-olok lokal untuk setiap pengujian.
sumber
TL; DR Jika beberapa argumen dalam pengujian Anda
null
, pastikan untuk memalsukan panggilan parameter denganisNull()
alih - alihanyXXX()
.Saya mendapat kesalahan ini saat memutakhirkan dari Spring boot 1.5.x ke 2.1.x. Spring boot dikirimkan dengan Mockito-nya sendiri, yang sekarang juga ditingkatkan ke 2.x (lihat misalnya Dependensi Spring boot 2.1.2 )
Mockito telah berubah perilaku untuk
anyXXX()
metode, di manaXXX
adalahString
,Long
, dll Berikut adalah javadoc darianyLong()
:Saya sarankan Anda men-debug ke titik di mana tiruan Anda akan dipanggil dan diperiksa, apakah setidaknya ada satu argumen
null
. Dalam hal ini pastikan, bahwa Anda menyiapkan tiruan Anda denganisNull()
alih - alih misalnyaanyLong()
.Jadi ini:
menjadi:
sumber
Ini kasus saya:
//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();
Lalu saya mendapatkan kesalahan ini:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2() method2() should return String
Bisakah kamu menebak?
Masalahnya adalah Target.method1 () adalah metode statis. Mockito benar-benar memperingatkan saya tentang hal lain.
sumber