junit test--简单常用语法总结

本文介绍了如何在Spring测试中使用MockBean和SpyBean进行方法行为定义和验证,包括不调用真实方法、指定返回值、模拟异常、部分方法调用真实方法等场景,并展示了MockMvc进行HTTP请求的验证方法。
摘要由CSDN通过智能技术生成

MockBean定义行为和验证

@SpringBootTest
class HelloControllerTest {

    //没有定义方法行为前, 所有调用不会真实调用且返回null
    @MockBean
    private Service service;

    @Autowired
    private HelloController helloController;

    //mockBean里方法不定义行为, 结果不调用真实方法且直接返回null
    @Test
    void test() {
        String s = helloController.testMock(3);

        Assert.assertNull(s);
        verify(service, times(1)).testMock(3);
    }
    
    //mockBean里方法定义行为, 结果不调用真实方法,按照定义方法行为返回
    @Test
    void test0() {
        when(service.testMock(3)).thenReturn("mock");

        String s = helloController.testMock(3);

        Assert.assertEquals("mock", s);
        verify(service, times(1)).testMock(3);
    }

    //mock抛异常
    @Test
    void test1() {
        when(service.testMock(3)).thenReturn("mock");

        String s = helloController.testMock(3);

        Assert.assertEquals("service error", s);
        verify(service, times(1)).testMock(3);
    }
}
@RestController
public class HelloController {

    @Autowired
    private Service service;

    @RequestMapping("/test")
    public String testMock(int i){
        String s;
        try {
            s = service.testMock(i);
        } catch (Exception e) {
            s = "service error";
        }
        return s;
    }
}
@Service
public class HelloService {

    private ConcurrentHashMap<String, String> DB = new ConcurrentHashMap<>();

    public String testMock(int i){
        return "success";
    }
    
}

MockBean调用真实方法

    //部分方法mock, 部分方法call真实方法
    @Test
    void test2() {
        when(service.testMock(3)).thenReturn("mock");
        when(service.testMock2(3)).thenCallRealMethod();

        String s = helloController.testMock2(3);

        Assert.assertEquals("mock success2", s);
        verify(service, times(1)).testMock(3);
    }
    @RequestMapping("/test2")
    public String testMock2(int i){
        String s;
        String s2;
        s = service.testMock(i);
        s2 = service.testMock2(i);
        return s + " " + s2;
    }
    public String testMock(int i){
        return "success";
    }

    public String testMock2(int i){
        return "success2";
    }

验证时参数是对象时

    //mock验证参数是对象时
    @Test
    void test3() {
        when(service.testMock3(any())).thenReturn("mock");

        String s = helloController.testMock3("Joe", 2);

        Assert.assertEquals("mock", s);
        verify(service, times(1)).testMock3(argThat((People people)->{
            Assert.assertEquals("Joe", people.getName());
            Assert.assertEquals(new Integer(3), people.getWorkYear());
            return true;
        }));
    }
	@Builder
	@Data
	public class People {
    	private String name;
    	private Integer workYear;
	}
    @RequestMapping("/test3")
    public String testMock3(String name, Integer workYear){
        String s;
        People people = People.builder().name(name).workYear(workYear + 1).build();
        s = service.testMock3(people);
        return s;
    }
    public String testMock3(People people){
        return "success3";
    }

spyBean定义行为和验证

@SpringBootTest
public class HelloController2Test {

    //没有定义方法行为前, 所有调用会真实调用
    @SpyBean
    private Service service;

    @Autowired
    private HelloController helloController;

    //SpyBean里方法不定义行为, 结果调用真实方法
    @Test
    void test() {
        String s = helloController.testMock(3);

        Assert.assertEquals("success", s);
        verify(service, times(1)).testMock(3);
    }

    //spyBean里方法定义行为, 结果不调用真实方法,按照定义方法行为返回
    @Test
    void test0() {
        when(service.testMock(3)).thenReturn("mock");

        String s = helloController.testMock(3);

        Assert.assertEquals("mock", s);
        verify(service, times(1)).testMock(3);
    }

}

验证需要等待时间

@SpringBootTest
public class HelloController2Test {

    //没有定义方法行为前, 所有调用会真实调用
    @SpyBean
    private Service service;

    @Autowired
    private HelloController helloController;

    //验证时需要等待时间
    @Test
    void test4() {

        helloController.testMock4();

        Awaitility.await()
                .atMost(2, TimeUnit.SECONDS)
                .untilAsserted(()->{
                    //need wait
                    String queryString = service.queryDB();
                    Assert.assertEquals("success4", queryString);
                });
    }
    
}
        <dependency>
            <groupId>org.awaitility</groupId>
            <artifactId>awaitility</artifactId>
            <version>4.1.0</version>
            <scope>test</scope>
        </dependency>
    @RequestMapping("/test4")
    public void testMock4(){
        new Thread(()->{
            service.updateDB();
        }).start();
    }
public class Service {

    private ConcurrentHashMap<String, String> DB = new ConcurrentHashMap<>();

    public String queryDB(){
        return DB.get("1");
    }

    public void updateDB(){
        ThreadUtil.sleep(1);
        DB.put("1", "success4");
    }
}

http请求MockMvc验证

@SpringBootTest
@AutoConfigureMockMvc
public class ShopControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testShopController() throws Exception {
        String correlationId = UUID.randomUUID().toString();
        AddGoodsRequestDTO requestDTO = AddGoodsRequestDTO.builder().goodsNumber(112323123).version(5).type(2).name("phone").build();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("Correlation-Id", correlationId);
        String response = "{\"returnCode\":\"10010\",\"returnMessage\":\"success\",\"data\":true}";

        /*
        1、mockMvc.perform执行一个请求;
        2、MockMvcRequestBuilders.post("/goods")构造一个请求
        3、ResultActions.andExpect添加执行完成后的断言
        4、ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息
        5、ResultActions.andReturn表示执行完成后返回相应的结果
        */
        mockMvc.perform(
                MockMvcRequestBuilders.post("/goods")
                        .headers(headers)
                        .content(JSON.toJSONString(requestDTO)))
                .andExpect(status().isOk())
                .andExpect(content().json(response));
    }
}
@RestController
public class ShopController {

    @PostMapping("/goods")
    public ResponseResult<Object> addGoods(@RequestBody AddGoodsRequestDTO requestDTO){
        return ResponseResult.builder().returnCode("10010").returnMessage("success").data(Boolean.TRUE).build();
    }

}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AddGoodsRequestDTO {
    private Integer goodsNumber;
    private Integer version;
    private Integer type;
    private String name;
}
@Data
@Builder
public class ResponseResult<T> {
    private String returnCode;
    private String returnMessage;
    private T data;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值