Springboot整合Junit5 常用注解
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
76套java從入門(mén)到精通實(shí)戰(zhàn)課程分享
@Test
在Springboot2.0版本之后,Junit就是5.幾的版本,在方法上添加@Test即可
@Test
void fun1(){
int res = 1+1;
Assertions.assertEquals(2,res);
System.out.println(123);
}
@BeforeEach & @AfterEach
每執(zhí)行一個(gè)@Test就會(huì)執(zhí)行一次
@BeforeEach
void before(){
System.out.println("before");
}
@AfterEach
void after(){
System.out.println("after");
}
@Test
void fun1(){
int res = 1+1;
Assertions.assertEquals(2,res);
System.out.println(123);
}
@Test
void fun2(){
System.out.println(456);
}

@BeforeAll & @AfterAll
無(wú)論有多少個(gè)@Test都只執(zhí)行一次,且@BeforeAll & AfterAll下的方法必須是靜態(tài)方法
@BeforeAll
static void init(){
System.out.println("init");
}
@AfterAll
static void destory(){
System.out.println("destory");
}
@BeforeEach
void before(){
System.out.println("before");
}
@AfterEach
void after(){
System.out.println("after");
}
@Test
void fun1(){
int res = 1+1;
Assertions.assertEquals(2,res);
System.out.println(123);
}
@Test
void fun2(){
System.out.println(456);
}

@SpringBootTest
在SpringBoot項(xiàng)目中,我們?cè)跍y(cè)試類中new 一個(gè)類時(shí),這個(gè)類可能同時(shí)會(huì)涉及到其他的Bean,而原來(lái)的@Test并不會(huì)涉及到Springboot的上下文,所以我們?cè)赟pringBoot項(xiàng)目中編寫(xiě)測(cè)試類時(shí),會(huì)在類上添加@SpringBootTest,細(xì)心的小伙伴會(huì)發(fā)現(xiàn)在我們創(chuàng)建項(xiàng)目選擇 Spring Initializr創(chuàng)建SpringBoot項(xiàng)目時(shí),目錄下會(huì)有一個(gè)Test文件,就會(huì)看到自動(dòng)創(chuàng)建好的Test類上帶有@SpringBootTest
同時(shí)也能配合@Autowired的注入
@SpringBootTest //能夠初始化springboot的上下文,防止new Serv01 的對(duì)象同時(shí)依賴其他的Bean
public class Test2 {
@Autowired
Serv01 serv01;
@Test
void t1(){
int add = serv01.add(1, 1);
Assertions.assertEquals(2,add);
System.out.println(11);
}
}
當(dāng)然,運(yùn)行這個(gè)帶@SpringBootTest的測(cè)試用例,也會(huì)啟動(dòng)我們的SpringBoot項(xiàng)目
@MockBean
通過(guò)mock來(lái)做到一個(gè)模擬,假如我們的測(cè)試需要寫(xiě)入數(shù)據(jù)庫(kù),可能會(huì)造成一些不可挽回的操作
我們對(duì)這些危險(xiǎn)的操作會(huì)使用mock來(lái)進(jìn)行一個(gè)模擬
我們來(lái)看下面的代碼
@SpringBootTest //能夠初始化springboot的上下文,防止new Serv01 的對(duì)象同時(shí)依賴其他的Bean
public class Test2 {
@MockBean
Serv01 serv01;
@Test
void t1(){
int add = serv01.add(1, 1);
Assertions.assertEquals(2,add);
System.out.println(11);
}
}

通過(guò)斷點(diǎn)得知 變量add 竟然等于0
原因就是我們?cè)赟pringBoot上下文的serv01的這個(gè)bean已經(jīng)被我們的mock替換掉了,因?yàn)槲覀兊膍ock并沒(méi)有任何指定操作,所以我們的int變量add 只會(huì)有默認(rèn)值 0
我們對(duì)mock添加一些指定操作
@SpringBootTest
public class Test2 {
@MockBean
Serv01 serv01;
@Test
void t1(){
when(serv01.add(1,1)).thenReturn(3);
int add = serv01.add(1, 1);
Assertions.assertEquals(2,add);
System.out.println(11);
}
}


我們?cè)俅涡薷拇a,在Serv01添加sub的方法,然后運(yùn)行測(cè)試

我們可以發(fā)現(xiàn)在我們指定規(guī)則的add方法,得出的結(jié)果是3,而未指定規(guī)則的sub方式則默認(rèn)int變量為0
如果說(shuō)我們想讓sub按照原來(lái)的方式進(jìn)行測(cè)試,不想被@MockBean影響,我們可以使用@SpyBean
@SpyBean
是介于@MockBean和@Autowired之間,在配置了規(guī)則的方法就按配置規(guī)則的執(zhí)行,沒(méi)有配置的就按原來(lái)的方法執(zhí)行測(cè)試

如果我們?cè)趧?chuàng)建一個(gè)serv02,讓serv01調(diào)用serv02的方法,運(yùn)行的結(jié)果還是一樣嗎?
@Service
public class Serv02 {
int add2(int a, int b){
return a+b;
}
}
@Service
public class Serv01 {
@Autowired
Serv02 serv02;
public int add(int a,int b){
return serv02.add2(a,b);
}
public int sub(int a,int b){
return a-b;
}
}
@SpringBootTest //能夠初始化springboot的上下文,防止new Serv01 的對(duì)象同時(shí)依賴其他的Bean
public class Test2 {
@SpyBean
Serv01 serv01;
@MockBean
Serv02 serv02;
@Test
void t1(){
when(serv01.add(1,1)).thenReturn(3);
int add = serv01.add(1, 1);
int sub = serv01.sub(2,1);
Assertions.assertEquals(3,add);
Assertions.assertEquals(1,sub);
System.out.println(11);
}
}

運(yùn)行成功,即使我們mock的是serv02,通過(guò)serv01調(diào)用的add方法調(diào)用serv02的add2方法,照樣運(yùn)行成功!
最后按照測(cè)試規(guī)范,我們一般一個(gè)類對(duì)應(yīng)一個(gè)test,但也可能出現(xiàn)一個(gè)類對(duì)應(yīng)多個(gè)test,因?yàn)榭赡艹霈F(xiàn)test調(diào)用多個(gè)類的情況!
————————————————
版權(quán)聲明:本文為CSDN博主「小爽帥到拖網(wǎng)速」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/weixin_46195957/article/details/114273530
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
??長(zhǎng)按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
