Saya menguji pengontrol saya yang diberikan di bawah ini
@Controller
public class MasterController {
@GetMapping("/")
public String goLoginPage(){
return "index";
}
}
Saya mengikuti ini dokumentasi Spring untuk menguji kontroler saya.
Sekarang, saya ingin menguji controller saya hanya dengan menginstansiasi web layer dan bukan seluruh konteks Spring seperti yang diberikan dalam dokumentasi. Di bawah ini adalah kode saya untuk hal yang sama.
@RunWith(SpringRunner.class)
@WebMvcTest
public class MasterControllerTestWithWebLayer {
@Autowired
MockMvc mockMvc;
@Autowired
MasterController masterController;
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testLoginHome() throws Exception{
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("index"));
}
}
Ketika saya menjalankan tes ini, saya mendapatkan kesalahan Tidak dapat menemukan @SpringBootConfiguration,...etc
. Tetapi saya bingung mengapa ia meminta konfigurasi Spring ketika kita tidak ingin menginstansiasi tetapi hanya ingin menggunakan lapisan web. Mohon tunjukkan saya ke arah yang benar apa yang terjadi di sini. Dan juga bagaimana cara memperbaikinya. Terima kasih
Jadi, inilah solusinya:
Dokumentasi tentang mendeteksi konfigurasi tes mengatakan:
Algoritma pencarian bekerja dari paket yang berisi tes sampai menemukan kelas beranotasi @SpringBootApplication atau @SpringBootConfiguration. Selama Anda telah menyusun kode Anda dengan cara yang masuk akal, konfigurasi utama Anda biasanya ditemukan.
Jadi kelas @SpringBootApplication
harus lebih tinggi dalam hirarki paket daripada kelas tes, misalnya jika kelas tes berada dalam paket com.zerosolutions.controller
maka kelas @SpringBootApplication
harus dalam paket yang lebih tinggi dari paket com.zerosolutions.controller
yaitu com.zerosolutions
atau com
.
Masalah
Tetapi jika kelas @SpringBootApplication
berada pada level yang sama dengan kelas tes, kelas tersebut tidak akan dapat menemukannya yaitu com.zerosolutions.general
. Dalam hal ini Anda akan mendapatkan kesalahan berikut:
java.lang.IllegalStateException: Tidak dapat menemukan @SpringBootConfiguration, Anda perlu menggunakan @ContextConfiguration atau @SpringBootTest(classes=...) dengan tes Anda
Solusi
Jika Anda menjalankan tes terintegrasi, Anda dapat secara eksplisit menyebutkan kelas @SpringBootApplication
seperti ini
@RunWith(SpringRunner.class)
@SpringBootTest(classes={SpringBootApp.class})
Tetapi jika Anda ingin melakukan unit testing dari sebuah controller, Anda tidak perlu menjalankan seluruh konteks Spring. Anda dapat mengganti @SpringBootTest
dengan @WebMvcTest(MasterController.class)
. Ini hanya akan menginstansiasi lapisan web dengan MasterController
dan bukan seluruh konteks Spring.
Masalah
Tetapi masalahnya adalah Anda akan kembali mengalami kesalahan yang kita hadapi sebelumnya:
java.lang.IllegalStateException: Tidak dapat menemukan @SpringBootConfiguration, Anda perlu menggunakan @ContextConfiguration atau @SpringBootTest(classes=...) dengan test Anda
Dan @WebMvtTest
tidak memiliki atribut classes
seperti @SpringBootTest
untuk secara eksplisit menyebutkan kelas @SpringBootApplication
.
Jadi ada dua solusi untuk ini.
Solusi
Pertama: Pindahkan kelas aplikasi Anda ke paket yang lebih tinggi dari kelas tes yaitu paket com.zerosolutions
atau com
.
Kedua: Sebutkan kelas @SpringBootApplication
Anda secara eksplisit seperti di bawah ini
@RunWith(SpringRunner.class)
@WebMvcTest(MasterController.class)
@ContextConfiguration(classes={SpringBootApp.class})
Semoga ini dapat menghilangkan kebingungan Konfigurasi Spring Test. Terima kasih
Jika kelas Application.java Anda (di src/main/java) terletak di bawah
com.A.B
Kelas uji Anda ApplicationTest.java (di src/test/java) harus berada di bawah
com.A.B
atau com.A.B.C
atau com.A.B.C.D
Anda akan mendapatkan kesalahan ini jika kelas tes terletak di bawah paket-paket berikut ini
com.A
atau com.A.C
atau com.A.D
Di Spring boot ATURAN UMUMNYA ADALAH NAMA PAKET KELAS UJI HARUS DIMULAI DENGAN NAMA PAKET DARI PAKET KELAS JAVA YANG AKAN DIUJI
Saya mengalami kesalahan yang sama, dan menemukan bahwa ketika saya membuat proyek, pom.xml saya menunjukkan groupId saya sebagai com.example, bukan dengan domain saya yang sebenarnya:
<groupId>com.example</groupId>
Saya mengoreksi pom.xml menjadi:
<groupId>com.mydomain</groupId>
Selanjutnya, saya mengubah struktur file dari:
src/test/java/com/example
menjadi src/test/java/com/mydomain
Terakhir, saya harus memperbarui deklarasi paket di dalam
SampleProjectApplicationTest.java
saya untuk mencocokkan struktur file yang benar. Setelah semua itu ada, tes bekerja dengan baik.
Saya tidak yakin bagaimana saya berakhir dengan com.example di mana sisa proyek saya benar, tetapi perbaikannya sesederhana itu dalam kasus saya.
Semoga ini membantu seseorang.