SpringBoot註解

zhegeMaw發表於2024-08-16

一個測試類包含下面兩個註解:

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@RunWith(SpringRunner.class)
@SpringBootTest</pre>

測試類中可直接注入介面:

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Resource
MyServerMgr myServerMgr;</pre>

在方法上加@Test表示它是個測試方法:

[
1936405-70596222ced81de5.gif
複製程式碼

](javascript:void(0); "複製程式碼")

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Test public void query() {
String result = myServerMgr.query();
log.info("test query result is {}.", result); //使用斷言判斷結果
assertEquals(result, "query result");
}</pre>

[
1936405-56feda021890f240.gif
複製程式碼

](javascript:void(0); "複製程式碼")

可以通過@Before和@After註解修飾的方法,來表示測試方法執行前和執行後的行為。

[
1936405-e399c46703312c40.gif
複製程式碼

](javascript:void(0); "複製程式碼")

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Before public void setUp() throws Exception {
log.info("Before setUp.");
}

@After public void tearDown() throws Exception {
log.info("After tearDown.");
}</pre>

[
1936405-fc81ca8fd488bf5e.gif
複製程式碼

](javascript:void(0); "複製程式碼")

至此一個簡單的單元測試就完成了。

Spring Mock MVC:模擬Servlet容器裡的測試控制器。

下面部分介紹如何測試Spring Controller API。

Controller測試類需要額外增加@WebAppConfiguration註解:

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration</pre>

需要在測試類中注入WebApplicationContext:

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Resource private WebApplicationContext webApplicationContext;</pre>

需要使用MockMvc模擬傳送rest請求,所以需要定義MockMvc變數並在測試方法執行前初始化它:

[
1936405-90e1650441ef65c7.gif
複製程式碼

](javascript:void(0); "複製程式碼")

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;"> private MockMvc mockMvc;

@Before public void setUp() throws Exception {
log.info("set mockmvc");
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); // mockMvc = MockMvcBuilders.standaloneSetup(webApplicationContext).build();
}</pre>

[
1936405-d7103627a9e51b4c.gif
複製程式碼

](javascript:void(0); "複製程式碼")

需要說明的是,Mock MVC有兩種構建方式:

standaloneSetup:手工建立並配置的控制器。

webAppContextSetup:根據Spring應用程式上下文來構建Mock MVC。

我們採用webAppContextSetup方式。

使用@Test註解宣告測試方法:

[
1936405-809db74335839729.gif
複製程式碼

](javascript:void(0); "複製程式碼")

<pre style="font-family: Courier New; font-size: 12px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre-wrap; word-wrap: break-word;">@Test public void query() throws Exception {
mockMvc.perform(get("/myapp"))
.andExpect(status().isOk())
.andExpect(content().string("query result"));
}</pre>

[
1936405-2a298865fb1c68a0.gif
複製程式碼

](javascript:void(0); "複製程式碼")

總結一下:

1、需要熟悉並掌握@RunWith(SpringRunner.class)、@SpringBootTest、@Before、@After、@Test幾個註解的用法。

2、測試服務端介面和測試Controller的不同是Controller需要額外的載入上下文並初始化MockMvc,並通過MockMvc模擬傳送rest請求,通過斷言判定結果是否正確

相關文章