Spring Boot:單元測試

單元測試

單元測試注意事項(xiàng)

  • 測試方法必須用@Test修飾
  • 測試方法必須使用public void修飾,不能帶參數(shù)
  • 一般使用單元測試會新建一個(gè)test目錄存放測試代碼蛉艾,在生產(chǎn)部署時(shí)只要將test代碼目錄刪除即可
  • 測試代碼的包應(yīng)該和被測試代碼的包結(jié)構(gòu)一致
  • 測試單元中的每個(gè)方法必須可以獨(dú)立測試杈曲,方法間不能有任何依賴
  • 測試類一般用Test作為類名后綴
  • 測試放一般使用test作為方法名前綴

常用注解

  • @Test:將一個(gè)普通方法修飾稱一個(gè)測試方法
    • @Test(excepted==xx.class) 忽略某異常類
    • @Test(timeout=毫秒數(shù)) 測試方法執(zhí)行時(shí)間是否符合預(yù)期
  • @BeforeClass:會在所有方法執(zhí)行前執(zhí)行
  • @Afterclass:會在所有方法執(zhí)行后執(zhí)行
  • @Before:在每一個(gè)測試方法被運(yùn)行前執(zhí)行一次
  • @After:在每一個(gè)測試方法運(yùn)行后執(zhí)行一次
  • @Ignore:修飾的方法會被測試運(yùn)行器忽略
  • @RunWith:更改測試運(yùn)行器
    • @RunWith(SpringRunner.class)

Spring Boot 單元測試

  • Spring Boot 提供了兩個(gè)包來支持單元測試:
    • spring-boot-test:包含測試的核心
    • spring-boot-test-autoconfigure:用來支持測試的自動配置

配置相關(guān)注解

@SpringBootTest

  • 它能夠測試 SpringApplication谷炸,因?yàn)?SpringBoot 程序入口是SpringApplication遥赚,基本所有配置都會通過入口類去加載疏咐,也可以通過 classes 屬性設(shè)置應(yīng)用程序入口類,webEnvironment 可以設(shè)置 web 測試環(huán)境脐供,可選屬性有:
    • MOCK:提供一個(gè)模擬的Servlet環(huán)境浑塞,內(nèi)置的Servlet容器沒有啟動,配合@AutoConfigureMockMvc使用
    • RANDOM_PORT:提供真實(shí)的Servlet環(huán)境政己,啟動內(nèi)置容器酌壕,隨即端口
    • DEFINED_PORT:配置真實(shí)Servlet環(huán)境,使用默認(rèn)端口
    • NONE:提供跟Mock一樣不真實(shí)的Servlet環(huán)境

@LocalServerPort

  • 注解在屬性上歇由,注入端口號

@ActiveProfiles(profiles = "test")

  • 指定多環(huán)境測試時(shí)的環(huán)境配置

@Slf4j

  • 如果不想每次都寫下面代碼可以用注解@Slf4j
private  final Logger logger = LoggerFactory.getLogger(XXX.class); 

@AutoConfigureMockMvc

  • 配合 @SpringBootTest 注入一個(gè) MockMvc 實(shí)例

@WebAppConfiguration

  • 聲明一個(gè)用于測試的 ApplicationContext 來模擬 ServletContext

測試?yán)?/h2>

測試 REST 接口

  • 測試 REST 接口可以配合 TestRestTemplate
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class卵牍,webEnvironment = WebEnvironment.RANDOM_PORT)
public class RandomPortExampleTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void exampleTest() {
        String body = this.restTemplate.getForObject("/", String.class);
        assertThat(body).isEqualTo("Hello World");
    }
}

測試 Spring MVC

  • 測試 SpringMVC Controller 可以使用 @WebMvcTEst,它會自動配置 MockMvc沦泌,Mock MVC 提供了一種方法來測試 MVC Controller糊昙,而不用啟動完整的 HTTP Server
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class SessionControllerTest {

    @Autowired
    private MockMvc mvc;

    private ObjectMapper objectMapper = new ObjectMapper();

    @Test
    public void testLogin() throws Exception {
        LoginDTO loginDTO = new LoginDTO();
        loginDTO.setUsername("linyuan");
        loginDTO.setPassword("123456");
        byte[] body = objectMapper.writeValueAsBytes(loginDTO);
        String resp = this.mvc.perform(
                post("/session")              //請求的URL
                        .content(body)                   //請求的數(shù)據(jù)
                        .param("請求的參數(shù)名","參數(shù)值")          //請求的參數(shù)
                        .contentType(MediaType.APPLICATION_JSON)    //請求數(shù)據(jù)的格式
                        .accept(MediaType.APPLICATION_JSON)         //接收返回?cái)?shù)據(jù)的格式
        ).andExpect(status().isOk())                     //驗(yàn)證執(zhí)行結(jié)果狀態(tài)碼
         .andDo(print())                                 //請求結(jié)果處理,輸出請求結(jié)果
         .andReturn().getResponse().getContentAsString();       //最后返回的結(jié)果谢谦,將數(shù)據(jù)轉(zhuǎn)換為字符串
        System.out.println(resp);
    }

}

----- 持續(xù)更新中 -----

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末释牺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子回挽,更是在濱河造成了極大的恐慌没咙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千劈,死亡現(xiàn)場離奇詭異祭刚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門涡驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暗甥,“玉大人,你說我怎么就攤上這事遮怜×苄洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵锯梁,是天一觀的道長即碗。 經(jīng)常有香客問我,道長陌凳,這世上最難降的妖魔是什么剥懒? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮合敦,結(jié)果婚禮上初橘,老公的妹妹穿的比我還像新娘。我一直安慰自己充岛,他們只是感情好保檐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崔梗,像睡著了一般夜只。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒜魄,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天扔亥,我揣著相機(jī)與錄音,去河邊找鬼谈为。 笑死旅挤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伞鲫。 我是一名探鬼主播粘茄,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秕脓!你這毒婦竟也來了驹闰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撒会,失蹤者是張志新(化名)和其女友劉穎嘹朗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诵肛,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屹培,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年默穴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪秀。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓄诽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媒吗,到底是詐尸還是另有隱情仑氛,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布闸英,位于F島的核電站锯岖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏甫何。R本人自食惡果不足惜出吹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辙喂。 院中可真熱鬧捶牢,春花似錦、人聲如沸巍耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炬太。三九已至竹勉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娄琉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工吓歇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孽水,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓城看,卻偏偏與公主長得像女气,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子测柠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355