SpringBoot結(jié)合mockito測試實戰(zhàn)
題目起的很像那么回事,但是這篇博客本身寫的很簡單。
我不想寫說一堆概念,然后闡釋各種概念是什么意思。我喜歡的是直接從例子出發(fā)。
package com.example.demo.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.Person;
import com.example.demo.mapper.PersonMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Random;
@RequestMapping({"/user"})
@RestController
@Slf4j
public class UserController {
@Autowired
PersonMapper personMapper;
@RequestMapping("/getUserById")
public Person getUserById(Long id){
Person person =personMapper.selectById(id);
if ("張三".equals(person.getName())){
return person;
}
if ("李四".equals(person.getName())){
person.setAge(17);
return person;
}
return person;
}
}
//具體的PersonMapper如下
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.Person;
import org.springframework.stereotype.Component;
@Component(value = "personMapper")
public interface PersonMapper extends BaseMapper<Person> {
}首先就是上面的例子,getUserById。
這個方法里面的邏輯可以分為兩部分,一個是通過mapper從db里面拿數(shù)據(jù),還有就是很多額外完全沒有邏輯的代碼,不用管它的具體語義,反正就是寫些業(yè)務(wù)邏輯。
我現(xiàn)在想測試的目的就是先假定mapper本身是OK的,然后驗證那些無意義的額外邏輯也是正確的。
ok,看測試代碼。
package com.example.demo.controller;
import com.example.demo.entity.Person;
import com.example.demo.mapper.PersonMapper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
import static org.mockito.Mockito.when;
@SpringBootTest
@ExtendWith(MockitoExtension.class)
public class MockitoTest {
@InjectMocks
private UserController userController;
@Mock
private PersonMapper personMapper;
@Test
public void testGet(){
Person person = new Person();
person.setName("張三");
Long id = 15L;
when(personMapper.selectById(id)).thenReturn(person);
Person result = userController.getUserById(id);
Assertions.assertEquals(person,result);
}
}運行之后:

那pom文件呢?
我用的是
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>沒有別的依賴了。
ok,測試代碼已經(jīng)能跑了,現(xiàn)在就來解釋代碼。
代碼解釋
@InjectMocks
這個注解就是說我要測試被這個注解標(biāo)注的類,他里面每個方法都會真正的被執(zhí)行。
換句話說,被這個注解標(biāo)注的類,是我們真正想測試的類。
InjectMocks 被這個注解標(biāo)注的類,是我們真正想測試的類。
InjectMocks 被這個注解標(biāo)注的類,是我們真正想測試的類。
InjectMocks 被這個注解標(biāo)注的類,是我們真正想測試的類。
@Mock
被這個注解標(biāo)注的是我們想忽略的或者說,默認(rèn)就認(rèn)為是ok的類。
when
personMapper本身就被@Mock標(biāo)注了,那么其實里面的每個方法都不會真正的被執(zhí)行,在UserController的Person person =personMapper.selectById(id);里面selectById就直接返回一個null。
但是加上下面的代碼
when(personMapper.selectById(id)).thenReturn(person);
功能我就不解釋了。
到此這篇關(guān)于SpringBoot結(jié)合mockito測試實戰(zhàn)的文章就介紹到這了,更多相關(guān)SpringBoot mockito內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tomcat啟動分析(我們?yōu)槭裁匆渲肅ATALINA_HOME環(huán)境變量)
本文主要介紹Tomcat啟動分析的知識,這里整理了相關(guān)資料及分析原因和如何實現(xiàn)的方法,有興趣的小伙伴可以參考下2016-09-09
IDEA解決src和resource下創(chuàng)建多級目錄的操作
這篇文章主要介紹了IDEA解決src和resource下創(chuàng)建多級目錄的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
springboot ApplicationContextInitializer的三種使用方法小結(jié)
這篇文章主要介紹了關(guān)于ApplicationContextInitializer的三種使用方法小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java結(jié)構(gòu)型設(shè)計模式中建造者模式示例詳解
建造者模式,是一種對象構(gòu)建模式 它可以將復(fù)雜對象的建造過程抽象出來,使這個抽象過程的不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對象。本文將通過示例講解建造者模式,需要的可以參考一下2022-09-09
Maven配置項目依賴使用本地倉庫的方法匯總(小結(jié))
這篇文章主要介紹了Maven配置項目依賴使用本地倉庫的方法匯總(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Spring data jpa @Query update的坑及解決
這篇文章主要介紹了Spring data jpa @Query update的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
關(guān)于Java的ArrayList數(shù)組自動擴容機制
這篇文章主要介紹了關(guān)于Java的ArrayList數(shù)組自動擴容機制,ArrayList底層是基于數(shù)組實現(xiàn)的,是一個動態(tài)數(shù)組,自動擴容,不是線程安全的,只能用在單線程環(huán)境下,需要的朋友可以參考下2023-05-05

