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

Larutan

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

Komentar (4)

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

Komentar (2)

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 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.

Komentar (0)