Saya menulis tes unit dan ingin menggunakan JUnitParamsRunner
dan MockitoJUnitRunner
untuk satu kelas tes.
Sayangnya, berikut ini tidak berhasil:
@RunWith(MockitoJUnitRunner.class)
@RunWith(JUnitParamsRunner.class)
public class DatabaseModelTest {
// some tests
}
Apakah ada cara untuk menggunakan keduanya, Mockito dan JUnitParams dalam satu kelas pengujian?
java
unit-testing
junit
Hans-Helge
sumber
sumber
Jawaban:
Anda tidak dapat melakukan ini karena menurut spesifikasi Anda tidak dapat meletakkan anotasi yang sama dua kali pada elemen beranotasi yang sama.
Lalu apa solusinya? Solusinya adalah dengan menempatkan hanya satu
@RunWith()
dengan pelari Anda tidak dapat berdiri tanpanya dan mengganti yang lain dengan yang lain. Dalam kasus Anda, saya kira Anda akan menghapusMockitoJUnitRunner
dan melakukan programatik apa yang dilakukannya.Faktanya, satu-satunya hal yang dilakukannya adalah:
di awal kasus uji. Jadi, solusi paling sederhana adalah memasukkan kode ini ke dalam
setUp()
metode:Saya tidak yakin, tetapi mungkin Anda harus menghindari beberapa panggilan dari metode ini menggunakan flag:
Namun lebih baik, solusi yang dapat digunakan kembali dapat diimplementasikan dengan aturan JUnt.
Sekarang tambahkan saja baris berikut ke kelas pengujian Anda:
dan Anda dapat menjalankan kasus uji ini dengan pelari mana pun yang Anda inginkan.
sumber
mockInitialized
salah. Anda ingin memiliki tiruan baru untuk setiap tetst.Mulai JUnit 4.7 dan Mockito 1.10.17, fungsionalitas ini sudah ada di dalamnya; ada
org.mockito.junit.MockitoRule
kelas. Anda cukup mengimpornya dan menambahkan gariske kelas pengujian Anda.
sumber
@Rule public MockitoJUnitRule mockito = new MockitoJUnitRule(this);
MockitoAnnotations.initMocks(this)
sangat lambat untuk membuat tiruan. Cara paling efisien adalah dengan menggunakan @Runwith (MockitoJunitRunner.class)Solusi ini berfungsi untuk setiap pelari yang mungkin, bukan hanya contoh mockito ini. Sebagai contoh; untuk Spring, cukup ubah kelas pelari dan tambahkan anotasi yang diperlukan.
DatabaseModelTest
akan dijalankan oleh JUnit.TestMockitoJUnitRunner
tergantung padanya (dengan logika) dan itu akan dijalankan di dalam main dalam sebuah@Test
metode, selama panggilanJUnitCore.runClasses(TestMockitoJUnitRunner.class)
. Metode ini memastikan runner utama dimulai dengan benar sebelumstatic class TestMockitoJUnitRunner
sub-runner berjalan, yang secara efektif mengimplementasikan beberapa@RunWith
anotasi bertingkat dengan class pengujian dependen.Juga di https://bekce.github.io/junit-multiple-runwith-dependent-tests
sumber
JUnitCore.runClasses()
tanpa memeriksa hasilnya, Anda berisiko menutupi kesalahan dari pengujian bagian dalam.assert(JUnitCore.runClasses(TestMockitoJUnitRunner.class).wasSuccessful());
setidaknya akan melaporkan kesalahan tersebut kepada AndaSejak rilis PowerMock 1.6, Anda dapat melakukannya semudah
Dijelaskan di sini https://blog.jayway.com/2014/11/29/using-another-junit-runner-with-powermock/
sumber
Dalam kasus saya, saya mencoba mengolok-olok beberapa metode dalam kacang musim semi dan
tidak bekerja. Sebagai gantinya Anda harus mendefinisikan kacang itu untuk dibangun menggunakan metode tiruan di dalam file xml Anda seperti berikut.
dan tambahkan kacang itu dengan autowired di dalam kelas pengujian Anda seperti berikut.
sumber
lihat tautan ini https://bekce.github.io/junit-multiple-runwith-dependent-tests/ menggunakan pendekatan ini saya menggabungkan @RunWith (Parameterized.class) - pelari luar - dengan @RunWith (MockitoJUnitRunner.class) - pelari batin. Satu-satunya perubahan yang harus saya tambahkan adalah membuat variabel anggota saya di kelas luar / pelari statis untuk membuatnya dapat diakses untuk pelari / kelas dalam / bersarang. gook luck dan nikmatilah.
sumber
Saya ingin menjalankan SWTBotJunit4ClassRunner dan org.junit.runners.Parameterized pada saat yang sama, saya memiliki tes parametrik dan saya ingin screenshot ketika tes SWT gagal (fitur screenshot disediakan oleh SWTBotJunit4ClassRunner ). Jawaban @ bekce bagus dan pertama kali ingin pergi ke rute itu tetapi itu aneh saat melewati argumen. Atau melakukan parametrized di subclass dan kehilangan informasi tes apa yang lulus / gagal dan hanya memiliki screenshot terakhir (karena nama screenshot mendapatkan nama dari pengujian itu sendiri). Jadi bagaimanapun juga itu agak berantakan.
Dalam kasus saya, SWTBotJunit4ClassRunner cukup sederhana, jadi saya mengkloning kode sumber kelas, memberinya nama saya sendiri ParametrizedScreenshotRunner dan di mana aslinya memperpanjang TestRunner , kelas saya memperluas kelas Parameterized sehingga pada dasarnya saya dapat menggunakan pelari saya sendiri bukan dua sebelumnya. Mendidih pelari saya sendiri meluas di atas pelari Parameterized saat menerapkan fitur screenshot di atasnya, sekarang pengujian saya menggunakan pelari "hybrid" dan semua tes bekerja seperti yang diharapkan langsung (tidak perlu mengubah apa pun di dalam tes).
Seperti inilah tampilannya (agar singkatnya saya menghapus semua komentar dari daftar):
sumber
Anda juga dapat mencoba ini:
sumber