以springboot3.0.2為例
在創(chuàng)建springboot項(xiàng)目時(shí)會(huì)默認(rèn)添加spring-boot-starter-test依賴,其中已經(jīng)包含了junit、mockito依賴,根據(jù)springboot版本的不同junit和mockito的版本也會(huì)有所不同
先說(shuō)一下各自功能:
- junit只說(shuō)一點(diǎn),junt4和junit5的注解不同,使用方式略有差異,其他不贅述了,基本用法都懂。
- mockito是mock的一種框架,相比其他框架來(lái)說(shuō),mockito比較流行,并且springboot默認(rèn)集成的就是mockito。主要用于模擬一些假數(shù)據(jù),以完成單元測(cè)試。舉例來(lái)說(shuō)就是:A服務(wù)已經(jīng)開(kāi)發(fā)完成,但是A服務(wù)中存在需要調(diào)用B服務(wù)的代碼,但是B服務(wù)還未開(kāi)發(fā)完成,為了對(duì)A服務(wù)進(jìn)行測(cè)試,可以使用Mock框架,當(dāng)A服務(wù)中調(diào)用B服務(wù)時(shí),就是用Mock框架返回一個(gè)模擬的假數(shù)據(jù)(返回的假數(shù)據(jù)的數(shù)據(jù)格式和B服務(wù)返回的數(shù)據(jù)格式一致),以實(shí)現(xiàn)對(duì)A服務(wù)業(yè)務(wù)邏輯代碼的測(cè)試。
- jacoco:代碼覆蓋率檢查,在idea中通過(guò)配置就可以使用,后面會(huì)說(shuō),還有一種方式就是在pom問(wèn)價(jià)中添加jacoco插件也可以實(shí)現(xiàn)代碼覆蓋率檢查,后面同樣會(huì)介紹。
直接上代碼
@RestController
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value = "/selectUser",method = RequestMethod.GET)
public String selectUserById(@RequestParam String id){
UserVO userVO = userService.selectUserById(id);
return userVO.toString();
}
}
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public UserVO selectUserById(String id) {
if(StringUtil.isEmpty(id)){
throw new NullPointerException("id is null");
}
return userMapper.selectUserById(id);
}
}
@SpringBootTest
public class UserControllerTest {
@MockBean
private UserMapper userMapper;
@Resource
private UserService userService;
@Resource
private UserController userController;
@Test
public void selectUserById() {
UserVO user = new UserVO();
user.setId("1001");
user.setName("test01");
Mockito.when(userMapper.selectUserById(Mockito.anyString())).thenReturn(user);
String result = userController.selectUserById("1002");
Assertions.assertEquals(user.toString(),result);
}
}
簡(jiǎn)單解釋一下:
@SpringBootTest 是一個(gè)組合注解,由spring提供,標(biāo)注該類(lèi)是一個(gè)測(cè)試類(lèi)
@MockBean 被MockBean標(biāo)注的類(lèi),表示會(huì)為該類(lèi)創(chuàng)建一個(gè)模擬的假對(duì)象,這個(gè)模擬的假對(duì)象的方法的方法體和返回值都為空,該注解也是由spring提供的。
所以上面代碼的意思是,當(dāng)我的代碼邏輯中用到UserMapper這個(gè)類(lèi)中的方法時(shí)都返回null。但是因?yàn)槲掖a中存在 Mockito.when(userMapper.selectUserById(Mockito.anyString())).thenReturn(user); 這句代碼的意思是,當(dāng)我調(diào)用userMapper.selectUserById()時(shí)返回自定義的UserVO對(duì)象。
Mockito常用注解
@Mock 被@Mock標(biāo)記的類(lèi)會(huì)創(chuàng)建一個(gè)虛擬的對(duì)象,該對(duì)象的方法的方法體和返回值都為空
@Spy 被@Spy標(biāo)記的類(lèi)會(huì)創(chuàng)建這個(gè)類(lèi)的真實(shí)實(shí)例,并且如果調(diào)用時(shí)沒(méi)有打樁,則會(huì)執(zhí)行該類(lèi)的真實(shí)邏輯。
@InjectMocks 被@InjectMocks標(biāo)記的類(lèi)會(huì)創(chuàng)建該類(lèi)的真實(shí)實(shí)例,并且該類(lèi)中依賴注入的其他類(lèi)會(huì)使用被@Mock 或者@Spy 標(biāo)記的類(lèi)注入
Spring中和Mock相關(guān)的注解
@MockBean 作用和@Mock相同,不同點(diǎn)是,被@MockBean標(biāo)注的類(lèi)會(huì)被Spring容器管理,而被@Mock標(biāo)記的類(lèi)不會(huì)。@MockBean是由Spring提供的注解,@Mock是Mockito框架的注解
@SpyBean 作用和@Spy相同。區(qū)別與 @MockBean和@Mock的區(qū)別一致。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-422191.html
常用的注解組合使用方式
1. @SpringBootTest + @MockBean / @SpyBean + @Resource / @Autowired文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422191.html
@SpringBootTest 標(biāo)注在測(cè)試類(lèi)上。
@MockBean 標(biāo)注在被測(cè)試類(lèi)中需要的注入的其他類(lèi)上,表示該類(lèi)如果在測(cè)試過(guò)程中遇到,不需要執(zhí)行真實(shí)邏輯,直接返回空。
@SpyBean 標(biāo)注在被測(cè)試類(lèi)中需要的注入的其他類(lèi)上,表示該類(lèi)如果在測(cè)試過(guò)程中遇到,如果沒(méi)有打樁,則執(zhí)行真實(shí)邏輯,返回真實(shí)的執(zhí)行結(jié)果,如果打樁了,則返回打樁的值。
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public UserVO selectUserById(String id) {
if(
到了這里,關(guān)于springboot項(xiàng)目使用Junit5 + mockito + jacoco 實(shí)現(xiàn)單元測(cè)試以及代碼覆蓋率檢查的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!