SpringBoot 使用Mock单元测试

本文介绍了在SpringBoot项目中,如何进行黑盒测试(功能测试)和白盒测试(结构测试),并详细讲解了Junit注解的使用以及Mockito模拟测试,包括`@Mock`和`@InjectMocks`的区分,以及如何使用`ReflectionTestUtils`和Mockito方法进行实际测试案例的演示。
摘要由CSDN通过智能技术生成

测试一般分为两种黑盒测试和白盒测试。

        黑盒测试又称为功能测试数据驱动测试,测试过程中,程序看作成一个黑色盒子,看不到盒子内部代码结构。

        白盒测试又称为结构测试逻辑驱动测试,测试过程中,程序看作一个透明盒子,能够看清盒子内部的代码和结构,这样测试人员对程序代码的逻辑有所知晓。

1. Junit 的注解

@Test:使用该注解标注的public void方法会表示为一个测试方法;
@BeforeClass:表示在类中的任意public static void方法执行之前执行;
@AfterClass:表示在类中的任意public static void方法之后执行;
@Before:表示在任意使用@Test注解标注的public void方法执行之前执行;
@After:表示在任意使用@Test注解标注的public void方法执行之后执行;

2. Mock模拟测试

mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,只是模拟执行,并不会真正的执行。

  • @InjectMocks:通过创建一个实例,它可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。

  • @Mock:对函数的调用均执行mock(即虚假函数),不会调用真实的方法。

  • @Spy:对函数的调用均执行真正部分。

3.常用的 Mockito 方法

  • do/when:包括doThrow(…).when(…)/doReturn(…).when(…)/doAnswer(…).when(…)
  • given/will:包括given(…).willReturn(…)/given(…).willAnswer(…)
  • when/then: 包括when(…).thenReturn(…)/when(…).thenAnswer(…)/when(…).thenThrow(…)

4. Springboot测试

对于Springboot有些属性没办法Mock,比如@Value的注解。

但是可以使用

ReflectionTestUtils.setField(aService, "bService", bServiceMock);

5. 测试代码 

public class AService {

    BService bService;

    public String aCallB() {
        String bResult = bService.bCallBaidu();
        return "这是a;b返回:" + bResult;
    }
}
public class BService {

    @Autowired
    RestTemplate restTemplate;

    public String bCallBaidu() {
        ResponseEntity<String> responseEntity = restTemplate.exchange("www.baidu.com", HttpMethod.POST, new HttpEntity<String>(""), String.class);
        return "这是b call baidu的结果:" + responseEntity;
    }
}
@RunWith(MockitoJUnitRunner.class)
public class AServiceTest {

    @InjectMocks
    AService aService;

    /**
     * @Mock 只是初始化一个模拟的实例化对象,并不会执行实例化的方法
     */
    @Mock
    BService bServiceMock;


    /**
     * @InjectMocks 实例化一个对象,并且会执行实例化对象的方法
     */
    @InjectMocks
    BService bServiceInjectMock;

    @Mock
    RestTemplate restTemplate;

    @Test
    public void testMock() {
        ReflectionTestUtils.setField(aService, "bService", bServiceMock);
        String result = aService.aCallB();
        System.out.println(result);

        Mockito.doReturn("模拟B返回").when(bServiceMock).bCallBaidu();
        result = aService.aCallB();
        System.out.println(result);
    }

    @Test
    public void testInjectMocks() {
        ReflectionTestUtils.setField(aService, "bService", bServiceInjectMock);
        // 如果不对restTemplate进行Mocke处理,bServiced的则会异常
//        String result = aService.aCallB();
//        System.out.println(result);

        Mockito.doReturn(new ResponseEntity<>("RestTemplate模拟返回成功", HttpStatus.OK))
                .when(restTemplate)
                .exchange(Mockito.anyString(), Mockito.eq(HttpMethod.POST), Mockito.any(HttpEntity.class), Mockito.eq(String.class));

        String result = aService.aCallB();
        System.out.println(result);
    }
}

参考:

 在SpringBoot中编写Mock单元测试 - 简书

SpringBoot——单元测试实践总结_springboot集成test框架单元测试-CSDN博客

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值