Kesalahan: Tidak dapat menemukan @SpringBootConfiguration ketika melakukan @WebMvcTest untuk Spring Controller
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
34
3
Jadi, inilah solusinya:
Dokumentasi tentang mendeteksi konfigurasi tes mengatakan:
Jadi kelas
@SpringBootApplication
harus lebih tinggi dalam hirarki paket daripada kelas tes, misalnya jika kelas tes berada dalam paketcom.zerosolutions.controller
maka kelas@SpringBootApplication
harus dalam paket yang lebih tinggi dari paketcom.zerosolutions.controller
yaitucom.zerosolutions
ataucom
.Masalah
Tetapi jika kelas
@SpringBootApplication
berada pada level yang sama dengan kelas tes, kelas tersebut tidak akan dapat menemukannya yaitucom.zerosolutions.general
. Dalam hal ini Anda akan mendapatkan kesalahan berikut:Solusi
Jika Anda menjalankan tes terintegrasi, Anda dapat secara eksplisit menyebutkan kelas
@SpringBootApplication
seperti iniTetapi 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 denganMasterController
dan bukan seluruh konteks Spring.Masalah
Tetapi masalahnya adalah Anda akan kembali mengalami kesalahan yang kita hadapi sebelumnya:
Dan
@WebMvtTest
tidak memiliki atributclasses
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
ataucom
.Kedua: Sebutkan kelas
@SpringBootApplication
Anda secara eksplisit seperti di bawah iniSemoga 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
ataucom.A.B.C
ataucom.A.B.C.D
Anda akan mendapatkan kesalahan ini jika kelas tes terletak di bawah paket-paket berikut ini
com.A
ataucom.A.C
ataucom.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:
com.example
Saya mengoreksi pom.xml menjadi:com.mydomain
Selanjutnya, saya mengubah struktur file dari:src/test/java/com/example
menjadisrc/test/java/com/mydomain
Terakhir, saya harus memperbarui deklarasi paket di dalamSampleProjectApplicationTest.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.