Junit+Mock

打印 上一主题 下一主题

主题 932|帖子 932|积分 2800

base project

  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.      <artifactId>spring-boot-starter-parent</artifactId>
  4.      <version>2.6.11</version>
  5.      <relativePath/>
  6. </parent>
  7. <dependencies>
  8.    <!--添加mysql依赖-->
  9.     <dependency>
  10.         <groupId>org.mariadb.jdbc</groupId>
  11.         <artifactId>mariadb-java-client</artifactId>
  12.         <version>2.7.2</version>
  13.     </dependency>
  14.     <dependency>
  15.         <groupId>com.baomidou</groupId>
  16.         <artifactId>mybatis-plus-boot-starter</artifactId>
  17.         <version>3.5.2</version>
  18.     </dependency>
  19.     <!--单元测试-->
  20.     <dependency>
  21.         <groupId>org.springframework.boot</groupId>
  22.         <artifactId>spring-boot-starter-test</artifactId>
  23.     </dependency>
  24.     <!--junit4-->
  25.     <dependency>
  26.         <groupId>org.junit.vintage</groupId>
  27.         <artifactId>junit-vintage-engine</artifactId>
  28.     </dependency>
  29.     <dependency>
  30.         <groupId>org.springframework.boot</groupId>
  31.         <artifactId>spring-boot-starter-web</artifactId>
  32.     </dependency>
  33.    
  34.     <dependency>
  35.         <groupId>org.projectlombok</groupId>
  36.         <artifactId>lombok</artifactId>
  37.     </dependency>
  38. </dependencies>
复制代码
application.yaml
  1. server:
  2.   port: 8896
  3. spring:
  4.   datasource:
  5.     username: root
  6.     password: root
  7.     url: jdbc:mariadb://local_IP_replace:3306/junit?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
  8.     driver-class-name: org.mariadb.jdbc.Driver
复制代码
controller
  1. @RestController
  2. @RequestMapping("/ele")
  3. public class EleController {
  4.     private final IEleService eleService;
  5.     @Autowired
  6.     public EleController(IEleService eleService) {
  7.         this.eleService = eleService;
  8.     }
  9.     @GetMapping(value = "/selectEleById")
  10.     public Result<Object> selectEleById(@RequestParam(value = "orderId") int orderId) {
  11.         Object object = eleService.selectEleById(orderId);
  12.         return Result.success(object);
  13.     }
  14.     @GetMapping(value = "/selectEleByIdAndName")
  15.     public Result<Object> selectEleByIdAndName(
  16.             @RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {
  17.         Object object = eleService.selectEleByIdAndName(id,name);
  18.         return Result.success(object);
  19.     }
  20. }
复制代码
service
  1. public interface IEleService {
  2.     Object selectEleById(int orderId);
  3.     Object selectEleByIdAndName(int id, String name);
  4. }
复制代码
  1. @Service
  2. public class EleService implements IEleService {
  3.     @Autowired
  4.     private IElementsMapper elementsMapper;
  5.     @Override
  6.     public Object selectEleById(int orderId) {
  7.         ElementsDO elementsDO = elementsMapper.selectById(orderId);
  8.         return elementsDO;
  9.     }
  10.     @Override
  11.     public Object selectEleByIdAndName(int id, String name) {
  12.         LambdaQueryWrapper<ElementsDO> queryWrapper = new LambdaQueryWrapper<>();
  13.         queryWrapper.eq(ElementsDO::getId, id);
  14.         queryWrapper.eq(ElementsDO::getElementName, name);
  15.         ElementsDO elementsDO = elementsMapper.selectOne(queryWrapper);
  16.         return elementsDO;
  17.     }
  18. }
复制代码
mapper
  1. @Mapper
  2. public interface IElementsMapper extends BaseMapper<ElementsDO> {
  3. }
复制代码
entity
  1. @Data
  2. @Builder
  3. @NoArgsConstructor
  4. @AllArgsConstructor
  5. @EqualsAndHashCode(callSuper = false)
  6. @TableName("ELEMENTS")
  7. public class ElementsDO implements Serializable {
  8.     /**
  9.      * id
  10.      */
  11.     @TableId(value = "ID", type = IdType.AUTO)
  12.     private Integer id;
  13.     /**
  14.      * 要素代码
  15.      */
  16.     @TableField(value = "ELEMENT_CODE")
  17.     private String elementCode;
  18.     /**
  19.      * 要素名称
  20.      */
  21.     @TableField(value = "ELEMENT_NAME")
  22.     private String elementName;
  23.     /**
  24.      * 单位
  25.      */
  26.     @TableField(value = "UNIT")
  27.     private String unit;
  28. }
复制代码
controller返回封装对象
  1. @JsonInclude(JsonInclude.Include.NON_NULL)
  2. public class Result<T> {
  3.     private int code;
  4.     private String msg="success";
  5.     private T data;
  6.     /**
  7.      *  成功时候的调用
  8.      * */
  9.     public static <T> Result<T> success() {
  10.         Result<T> result = new Result<T>();
  11.         result.code = 1;
  12.         return result;
  13.     }
  14.     public static<T> Result<T> success(T data){
  15.         return new Result<T>(data);
  16.     }
  17.     /**
  18.      *  失败时候的调用
  19.      * */
  20.     public static  <T> Result<T> error(CodeMsg codeMsg){
  21.         return new Result<T>(codeMsg);
  22.     }
  23.     private Result(T data) {
  24.         this.data = data;
  25.     }
  26.     private Result(int code, String msg) {
  27.         this.code = code;
  28.         this.msg = msg;
  29.     }
  30.     private Result() {
  31.     }
  32.     private Result(CodeMsg codeMsg) {
  33.         if(codeMsg != null) {
  34.             this.code = codeMsg.getCode();
  35.             this.msg = codeMsg.getMsg();
  36.         }
  37.     }
  38.     /**
  39.      * BindingResult统一处理
  40.      */
  41.     public static Result resolveBindResult(BindingResult bindingResult){
  42.         StringBuilder stringBuilder = new StringBuilder();
  43.         for (String s : bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.toList())) {
  44.             stringBuilder.append(",").append(s);
  45.         }
  46.         return Result.error(new CodeMsg(502,stringBuilder.toString().substring(1)));
  47.     }
  48.     public int getCode() {
  49.         return code;
  50.     }
  51.     public void setCode(int code) {
  52.         this.code = code;
  53.     }
  54.     public String getMsg() {
  55.         return msg;
  56.     }
  57.     public void setMsg(String msg) {
  58.         this.msg = msg;
  59.     }
  60.     public T getData() {
  61.         return data;
  62.     }
  63.     public void setData(T data) {
  64.         this.data = data;
  65.     }
  66.     @Override
  67.     public String toString() {
  68.         return "Result [code=" + code + ", msg=" + msg + ", data=" + data + "]";
  69.     }
  70. }
复制代码
Mock初始化

方式1
  1. import org.junit.jupiter.api.Test;
  2. import org.junit.jupiter.api.extension.ExtendWith;
  3. import org.mockito.Mock;
  4. import org.mockito.Mockito;
  5. import org.mockito.Spy;
  6. import org.mockito.junit.jupiter.MockitoExtension;
  7. @ExtendWith(MockitoExtension.class)
  8. public class Init1 {
  9.     //初始化模拟对象
  10.     @Mock
  11.     private EleService eleService;
  12.     //初始化真实对象
  13.     @Spy
  14.     private EleService eleService2;
  15.     @Test
  16.     public void test1(){
  17.         boolean mock = Mockito.mockingDetails(eleService).isMock();
  18.         System.out.println(mock);
  19.         boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();
  20.         System.out.println(mock1);
  21.     }
  22. }
复制代码
方式2
  1. import org.junit.jupiter.api.BeforeEach;
  2. @ExtendWith(MockitoExtension.class)
  3. public class Init2 {
  4.     private EleService eleService;
  5.     //初始化
  6.     @BeforeEach
  7.     public void init() {
  8.         eleService = Mockito.mock(EleService.class);
  9.     }
  10.     @Test
  11.     public void test1(){
  12.         //判断对象是否为muck对象
  13.         boolean mock = Mockito.mockingDetails(eleService).isMock();
  14.         System.out.println(mock);
  15.     }
  16. }
复制代码
方式3
  1. import org.junit.jupiter.api.BeforeEach;
  2. @ExtendWith(MockitoExtension.class)
  3. public class Init3 {
  4.     //初始化模拟对象
  5.     @Mock
  6.     private EleService eleService;
  7.     //初始化真实对象
  8.     @Spy
  9.     private EleService eleService2;
  10.     //初始化
  11.     @BeforeEach
  12.     public void init() {
  13.         //初始化当前类对象下的相关mock
  14.         MockitoAnnotations.openMocks(this);
  15.     }
  16.     @Test
  17.     public void test1(){
  18.         boolean mock = Mockito.mockingDetails(eleService).isMock();
  19.         System.out.println(mock);
  20.         boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();
  21.         System.out.println(mock1);
  22.     }
  23. }
复制代码
Mock默认返回值

int默认返回0,对象默认返回null,聚集默认返回空聚集(空的ArrayList、空的HashSet、空的HashMap)
  1. @ExtendWith(MockitoExtension.class)
  2. public class MockMethod1 {
  3.     //初始化模拟对象
  4.     @Mock
  5.     private EleService eleService;
  6.     @Test
  7.     public void test1(){
  8.         //Mock对象返回默认值,不会调用真正方法
  9.         Object o1 = eleService.selectEleById(1);//null
  10.         System.out.println(o1);
  11.     }
  12. }
复制代码
Mock参数设置

  1. @ExtendWith(MockitoExtension.class)
  2. public class MockMethod1 {
  3.     //初始化模拟对象
  4.     @Mock
  5.     private EleService eleService;
  6.     @Test
  7.     public void test1(){
  8.         /**
  9.          * 插桩,只拦截参数为1
  10.          */
  11.         //指定参数为1时,selectEleById方法时返回new Object()
  12.         Mockito.doReturn(new Object()).when(eleService).selectEleById(1);
  13.         Object o2 = eleService.selectEleById(1);
  14.         System.out.println(o2);//java.lang.Object@16b2bb0c
  15.     }
  16.     @Test
  17.     public void test2(){
  18.         /**
  19.          * 插桩,拦截selectEleById()的任意参数值
  20.          */
  21.         Mockito.doReturn(new Object()).when(eleService).selectEleById(ArgumentMatchers.any(Integer.class));
  22.         Object o2 = eleService.selectEleById(2);
  23.         System.out.println(o2);//java.lang.Object@c7045b9
  24.     }
  25. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表