东湖之滨 发表于 2025-2-25 13:03:35

Junit+Mock

base project

<parent>
    <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.6.11</version>
   <relativePath/>
</parent>

<dependencies>
   <!--添加mysql依赖-->
    <dependency>
      <groupId>org.mariadb.jdbc</groupId>
      <artifactId>mariadb-java-client</artifactId>
      <version>2.7.2</version>
    </dependency>

    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.5.2</version>
    </dependency>

    <!--单元测试-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!--junit4-->
    <dependency>
      <groupId>org.junit.vintage</groupId>
      <artifactId>junit-vintage-engine</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
   
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
</dependencies>
application.yaml
server:
port: 8896

spring:
datasource:
    username: root
    password: root
    url: jdbc:mariadb://local_IP_replace:3306/junit?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: org.mariadb.jdbc.Driver
controller
@RestController
@RequestMapping("/ele")
public class EleController {

    private final IEleService eleService;


    @Autowired
    public EleController(IEleService eleService) {
      this.eleService = eleService;
    }

    @GetMapping(value = "/selectEleById")
    public Result<Object> selectEleById(@RequestParam(value = "orderId") int orderId) {
      Object object = eleService.selectEleById(orderId);
      return Result.success(object);
    }

    @GetMapping(value = "/selectEleByIdAndName")
    public Result<Object> selectEleByIdAndName(
            @RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {
      Object object = eleService.selectEleByIdAndName(id,name);
      return Result.success(object);
    }
}
service
public interface IEleService {
    Object selectEleById(int orderId);
    Object selectEleByIdAndName(int id, String name);
}
@Service
public class EleService implements IEleService {
    @Autowired
    private IElementsMapper elementsMapper;
    @Override
    public Object selectEleById(int orderId) {
      ElementsDO elementsDO = elementsMapper.selectById(orderId);
      return elementsDO;
    }

    @Override
    public Object selectEleByIdAndName(int id, String name) {
      LambdaQueryWrapper<ElementsDO> queryWrapper = new LambdaQueryWrapper<>();
      queryWrapper.eq(ElementsDO::getId, id);
      queryWrapper.eq(ElementsDO::getElementName, name);
      ElementsDO elementsDO = elementsMapper.selectOne(queryWrapper);
      return elementsDO;
    }
}
mapper
@Mapper
public interface IElementsMapper extends BaseMapper<ElementsDO> {
}
entity
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("ELEMENTS")
public class ElementsDO implements Serializable {
    /**
   * id
   */
    @TableId(value = "ID", type = IdType.AUTO)
    private Integer id;
    /**
   * 要素代码
   */
    @TableField(value = "ELEMENT_CODE")
    private String elementCode;
    /**
   * 要素名称
   */
    @TableField(value = "ELEMENT_NAME")
    private String elementName;
    /**
   * 单位
   */
    @TableField(value = "UNIT")
    private String unit;
}
controller返回封装对象
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> {
    private int code;
    private String msg="success";
    private T data;

    /**
   *成功时候的调用
   * */

    public static <T> Result<T> success() {
      Result<T> result = new Result<T>();
      result.code = 1;
      return result;
    }

    public static<T> Result<T> success(T data){
      return new Result<T>(data);
    }

    /**
   *失败时候的调用
   * */
    public static<T> Result<T> error(CodeMsg codeMsg){
      return new Result<T>(codeMsg);
    }

    private Result(T data) {
      this.data = data;
    }

    private Result(int code, String msg) {
      this.code = code;
      this.msg = msg;
    }
    private Result() {
    }

    private Result(CodeMsg codeMsg) {
      if(codeMsg != null) {
            this.code = codeMsg.getCode();
            this.msg = codeMsg.getMsg();
      }
    }


    /**
   * BindingResult统一处理
   */
    public static Result resolveBindResult(BindingResult bindingResult){
      StringBuilder stringBuilder = new StringBuilder();
      for (String s : bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.toList())) {
            stringBuilder.append(",").append(s);
      }
      return Result.error(new CodeMsg(502,stringBuilder.toString().substring(1)));
    }

    public int getCode() {
      return code;
    }
    public void setCode(int code) {
      this.code = code;
    }
    public String getMsg() {
      return msg;
    }
    public void setMsg(String msg) {
      this.msg = msg;
    }
    public T getData() {
      return data;
    }
    public void setData(T data) {
      this.data = data;
    }

    @Override
    public String toString() {
      return "Result ";
    }

}
Mock初始化

方式1
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
public class Init1 {
    //初始化模拟对象
    @Mock
    private EleService eleService;
    //初始化真实对象
    @Spy
    private EleService eleService2;

    @Test
    public void test1(){
      boolean mock = Mockito.mockingDetails(eleService).isMock();
      System.out.println(mock);

      boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();
      System.out.println(mock1);
    }
}
方式2
import org.junit.jupiter.api.BeforeEach;
@ExtendWith(MockitoExtension.class)
public class Init2 {
    private EleService eleService;
    //初始化
    @BeforeEach
    public void init() {
      eleService = Mockito.mock(EleService.class);
    }

    @Test
    public void test1(){
      //判断对象是否为muck对象
      boolean mock = Mockito.mockingDetails(eleService).isMock();
      System.out.println(mock);
    }
}
方式3
import org.junit.jupiter.api.BeforeEach;
@ExtendWith(MockitoExtension.class)
public class Init3 {
    //初始化模拟对象
    @Mock
    private EleService eleService;
    //初始化真实对象
    @Spy
    private EleService eleService2;

    //初始化
    @BeforeEach
    public void init() {
      //初始化当前类对象下的相关mock
      MockitoAnnotations.openMocks(this);
    }

    @Test
    public void test1(){
      boolean mock = Mockito.mockingDetails(eleService).isMock();
      System.out.println(mock);

      boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();
      System.out.println(mock1);
    }
}
Mock默认返回值

int默认返回0,对象默认返回null,聚集默认返回空聚集(空的ArrayList、空的HashSet、空的HashMap)
@ExtendWith(MockitoExtension.class)
public class MockMethod1 {
    //初始化模拟对象
    @Mock
    private EleService eleService;

    @Test
    public void test1(){
      //Mock对象返回默认值,不会调用真正方法
      Object o1 = eleService.selectEleById(1);//null
      System.out.println(o1);
    }
}
Mock参数设置

@ExtendWith(MockitoExtension.class)
public class MockMethod1 {
    //初始化模拟对象
    @Mock
    private EleService eleService;

    @Test
    public void test1(){
      /**
         * 插桩,只拦截参数为1
         */
      //指定参数为1时,selectEleById方法时返回new Object()
      Mockito.doReturn(new Object()).when(eleService).selectEleById(1);
      Object o2 = eleService.selectEleById(1);
      System.out.println(o2);//java.lang.Object@16b2bb0c
    }

    @Test
    public void test2(){
      /**
         * 插桩,拦截selectEleById()的任意参数值
         */
      Mockito.doReturn(new Object()).when(eleService).selectEleById(ArgumentMatchers.any(Integer.class));
      Object o2 = eleService.selectEleById(2);
      System.out.println(o2);//java.lang.Object@c7045b9
    }
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Junit+Mock