Kode Saya adalah seperti di bawah ini,
@RunWith(MockitoJUnitRunner.class)
public class MyClass {
private static final String code ="Test";
@Mock
private MyClassDAO dao;
@InjectMocks
private MyClassService Service = new MyClassServiceImpl();
@Test
public void testDoSearch() throws Exception {
final String METHOD_NAME = logger.getName().concat(".testDoSearchEcRcfInspections()");
CriteriaDTO dto = new CriteriaDTO();
dto.setCode(code);
inspectionService.searchEcRcfInspections(dto);
List<SearchCriteriaDTO> summaryList = new ArrayList<SearchCriteriaDTO>();
inspectionsSummaryList.add(dto);
when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);//got error in this line
verify(dao).doSearchInspections(dto);
}
}
Saya mendapatkan pengecualian di bawah ini
org.mockito.exceptions.misusing.UnnecessaryStubbingException: Unnecessary stubbings detected in test class: Test Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary (click to navigate to relevant line of code): 1. -> at service.Test.testDoSearch(Test.java:72) Please remove unnecessary stubbings or use 'silent' option. More info: javadoc for UnnecessaryStubbingException class. at org.mockito.internal.exceptions.Reporter.formatUnncessaryStubbingException(Reporter.java:838) at org.mockito.internal.junit.UnnecessaryStubbingsReporter.validateUnusedStubs(UnnecessaryStubbingsReporter.java:34) at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:49) at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:103) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Tolong bantu saya bagaimana menyelesaikannya
@RunWith(MockitoJUnitRunner.Silent.class)
dan tidak SILENT@RunWith(MockitoJUnitRunner.Silent::class)
Pada awalnya, Anda harus memeriksa logika pengujian Anda. Biasanya ada 3 kasus. Pertama, Anda mengejek metode yang salah (Anda salah ketik atau seseorang mengubah kode yang diuji sehingga metode yang diejek tidak lagi digunakan). Kedua, pengujian Anda gagal sebelum metode ini dipanggil. Ketiga, logika Anda salah jika / switch cabang di suatu tempat dalam kode sehingga metode yang diejek tidak dipanggil.
Jika ini kasus pertama, Anda selalu ingin mengubah metode tiruan untuk metode yang digunakan dalam kode. Dengan yang kedua dan ketiga itu tergantung. Biasanya Anda harus menghapus tiruan ini jika tidak ada gunanya. Tapi terkadang ada kasus tertentu dalam tes parametrized, yang harus mengambil jalur yang berbeda ini atau gagal lebih awal. Kemudian Anda dapat membagi tes ini menjadi dua atau lebih tes terpisah tetapi itu tidak selalu bagus. 3 metode pengujian dengan kemungkinan 3 penyedia argumen dapat membuat pengujian Anda terlihat tidak terbaca. Dalam kasus untuk JUnit 4 Anda membungkam pengecualian ini dengan baik
anotasi atau jika Anda menggunakan pendekatan aturan
atau (perilaku yang sama)
Untuk pengujian JUnit 5 Anda dapat membungkam pengecualian ini dengan menggunakan anotasi yang disediakan dalam
mockito-junit-jupiter
paket.sumber
Mockito.lenient().when(...)
; untuk pertanyaan khusus ini adalahMockito.lenient().when(dao.doSearch(dto)).thenReturn(inspectionsSummaryList);
Diam bukanlah solusi. Anda perlu memperbaiki tiruan Anda dalam pengujian Anda. Lihat dokumentasi resmi di sini .
Stub yang tidak perlu adalah panggilan metode bertopik yang tidak pernah terwujud selama eksekusi pengujian (lihat juga MockitoHint), contoh:
Perhatikan bahwa salah satu metode yang dipotong tidak pernah direalisasikan dalam kode yang diuji, selama eksekusi uji. Stubbing yang menyimpang mungkin merupakan pengawasan dari pengembang, artefak dari copy-paste atau efek tidak memahami tes / kode. Apa pun alasannya, pengembang mendapatkan kode pengujian yang tidak perlu. Untuk menjaga basis kode tetap bersih & dapat dipelihara, perlu untuk menghapus kode yang tidak perlu. Jika tidak, tes lebih sulit untuk dibaca dan dipikirkan.
Untuk mengetahui lebih lanjut tentang mendeteksi stubbings yang tidak digunakan, lihat MockitoHint.
sumber
Bagi saya
@Rule
,@RunWith(MockitoJUnitRunner.Silent.class)
saran maupun saran itu tidak berhasil. Itu adalah proyek lama di mana kami meningkatkan ke mockito-core 2.23.0.Kita bisa menghilangkannya
UnnecessaryStubbingException
dengan menggunakan:dari pada:
Tidak perlu dikatakan bahwa Anda lebih baik melihat kode pengujian, tetapi kami perlu mengkompilasi barang-barang dan pengujian berjalan terlebih dahulu;)
sumber
Di
when
sini mengonfigurasi tiruan Anda untuk melakukan sesuatu. Namun, Anda tidak lagi menggunakan tiruan ini dengan cara apa pun setelah baris ini (selain melakukan averify
). Mockito memperingatkan Anda bahwawhen
garis itu tidak ada gunanya. Mungkin Anda membuat kesalahan logika?sumber
Service
) untuk melihat apakah itu bereaksi dengan benar. Anda tidak melakukan itu sama sekali, jadi apa yang Anda uji di sini?Melihat bagian dari jejak tumpukan Anda, sepertinya Anda mematikan bagian
dao.doSearch()
lain. Lebih seperti berulang kali membuat stub dari metode yang sama.Pertimbangkan Kelas Tes di bawah ini misalnya:
Saya lebih suka mempertimbangkan untuk memfaktorkan ulang pengujian Anda menjadi stub jika diperlukan.
sumber
Jika Anda menggunakan gaya ini sebagai gantinya:
ganti dengan:
sumber
Saya memiliki
UnnecessaryStubbingException
ketika saya mencoba menggunakanwhen
metode pada objek Spy.Mockito.lenient()
membungkam pengecualian tetapi hasil tes tidak benar.Dalam kasus objek Spy, seseorang harus memanggil metode secara langsung.
sumber
Nah, dalam kasus saya, kesalahan Mockito memberi tahu saya untuk memanggil metode sebenarnya setelah
when
atauwhenever
stub. Karena kami tidak menerapkan ketentuan yang baru saja kami olok, Mockito melaporkan itu sebagai stub atau kode yang tidak perlu.Beginilah rasanya ketika kesalahan itu datang:
lalu saya hanya memanggil metode sebenarnya yang disebutkan dalam pernyataan when untuk mengejek metode tersebut.
perubahan yang dilakukan adalah seperti di bawah ini
stockViewModelTest.getStockAvailability(listOf(), getStocksApiCallBack)
itu bekerja sekarang.
sumber
Menggantikan
@RunWith(MockitoJUnitRunner.class)
dengan
@RunWith(MockitoJUnitRunner.Silent.class)
atau hapus
@RunWith(MockitoJUnitRunner.class)
atau hanya mengomentari panggilan mengejek yang tidak diinginkan (ditampilkan sebagai penghentian yang tidak sah).
sumber
Dalam kasus proyek besar, sulit untuk memperbaiki setiap pengecualian ini. Pada saat yang sama, penggunaan
Silent
tidak disarankan. Saya telah menulis skrip untuk menghapus semua stubbings yang tidak perlu diberikan daftar mereka.https://gist.github.com/cueo/da1ca49e92679ac49f808c7ef594e75b
Kita hanya perlu menyalin-tempel
mvn
output dan menulis daftar pengecualian ini menggunakan regex dan membiarkan skrip menangani sisanya.sumber
Jika Anda menggunakan any () saat mengejek, Anda harus mengganti spasi @RunWith (MockitoJUnitRunner.class) dengan @RunWith (MockitoJUnitRunner.Silent.class).
sumber
any()
bekerja sempurna dengan pelari biasa bila digunakan dengan benar.Saat Anda membuat tiruan dan tiruan itu tidak digunakan, ia akan mengeluarkan pengecualian stubbing yang tidak terpakai. Dalam kasus Anda, tiruan itu sebenarnya tidak dipanggil. Oleh karena itu, pelempar kesalahan itu. Oleh karena itu, relpace
@RunWith(MockitoJUnitRunner.class)
dengan@RunWith(MockitoJUnitRunner.Silent.class)
yang akan menghapus kesalahan. Jika Anda masih ingin menggunakan@RunWith(MockitoJUnitRunner.class)
coba debug logika Anda jika fungsi yang Anda tiru sebenarnya dipanggil atau tidak.sumber