[Springboot 单元测试笔记] - Mock 和 spy的使用

这篇具有很好参考价值的文章主要介绍了[Springboot 单元测试笔记] - Mock 和 spy的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Springboot单元测试 - 依赖类mock测试

通常单元测试中,我们会隔离依赖对于测试类的影响,也就是假设所有依赖的一定会输出理想结果,在测试中可以通过Mock方法来确保输出结果,这也就引入另一个测试框架Mockito。

Mockito框架的作用就是模拟接口功能,并不运行模拟接口的实际逻辑,而是直接输出一个假定结果。

Mockito常见注释及方法

@Mock 被注释的对象会作为Mock对象
@InjectMocks 被注释的对象依赖于@Mock的对象,通常是测试对象
when(<MockObject>.<method>).thenReturn() 对@Mock的对象进行模拟输出
doThrow(<Exception>).when(<mockObject>).<Method> 对Mock的对象模拟抛出一个异常
spy() 也是建立一个模拟对象,但可以

待测试类 - AController

public class AController {

    @Autowired
    MongoService mongoService;

    public boolean testBean() {
        boolean res = mongoService.testMethod2(4);
        return res;
    }

}

依赖类 - MongoService

@Service
public class MongoService {

    public void output() {
        System.out.println("This is a bean!!");
    }

    public boolean testMethod1(int num) {
        return num > 0;
    }

    public boolean testMethod2(int num) {
        int val = getVal();
        return val > num;
    }

    private int getVal() {
        return 2;
    }
}

Mockito测试类 - RunWith需要运行MockitoJUnitRunner.class才能使用Mockito相关注解

方法1: 使用@Mock,更为简洁只需加入注解就可以mock对应成员变量 (该成员变量可以是非依赖注入)

@RunWith(MockitoJUnitRunner.class)
public class MockTest {

    @Mock
    MongoService mongoService;

    @InjectMocks
    AController aController;

    @Test
    public void testMock1() {
        when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);
        Assert.assertEquals(aController.testBean(), true);
    }

    @Test(expected = Exception.class)
    public void testMock2() {
        doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());
        aController.testBean();
    }
}

方法2: 使用Mock函数

public class MockTest {

    MongoService mongoService;

    AController aController;

    @BeforeEach
    public void init() {
        mongoService = Mock(MongoService.class);
        aController = new AController();
        /* 假设 AController class 中有setter用于加载mongoService */
        aController.setMongoService(mongoService);
        
    }

    @Test
    public void testMock1() {
        when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);
        Assert.assertEquals(aController.testBean(), true);
    }

    @Test(expected = Exception.class)
    public void testMock2() {
        doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());
        aController.testBean();
    }
}

 

@Mock 和 @Spy区别

上面两种注释都是建立一个模拟对象,但是区别是@Mock注释的对象是完全虚拟,不能调用这个Mock对象的任何方法,只能通过when().thenReturn() 来进行模拟输出;但是@Spy是建立一个真实的Mock对象,可以调用对象中任何方法也可以模拟某些方法的输出。@Spy大大增加了测试的自由度,比如如果某个测试类你只想模拟某个方法但是想要某些方法的真实输出,这是@Spy就可以解决这个问题。

举例 - 模拟MongoService其中一个方法,并测试另一个方法真实输出文章来源地址https://www.toymoban.com/news/detail-536303.html

    @Spy
    MongoService mongoServiceSpy;

    @Test
    public void testSpy() {
        /** 模拟MongoService中 getVal并测试testMethod2*/
        when(mongoServiceSpy.getVal()).thenReturn(3);
        Assert.assertEquals(mongoServiceSpy.testMethod2(2), true);
    }

Reference

  • SpringBoot Test及注解详解 - codedot - 博客园
  • 单元测试之Mockito与PowerMock - 简书

到了这里,关于[Springboot 单元测试笔记] - Mock 和 spy的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 测试人必会的Python内置库:unittest.mock(单元测试mock的基础使用)

    unittest.mock是用于在单元测试中模拟和替换指定的对象及行为,以便测试用例更加准确地进行测试运行。例如对于以下代码,想要针对函数func_a写一个简单的单元测试: 但是这样的话,函数func_b和func_c的逻辑都需要一起测试,在单元测试中这明显是不合理的,对于想要测试的

    2024年02月01日
    浏览(21)
  • C++类对象单元测试中的Mock使用

      在进行单元测试时,我们想要测试自己缩写 函数A ,但是 函数A 却依赖于 函数B ,当 函数B 无法满足预期时就无法对 函数A 进行测试,主要由于下面几个原因: 函数B 依赖于硬件设备 真实的 函数B 的返回值无法满足我们的预期 团队开发中 函数B 尚未实现   这时就需要

    2023年04月15日
    浏览(22)
  • python技术栈 之 单元测试中mock的使用

    一、什么是mock? mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 二、mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试,需要虚拟某些特定对象以便测试。 unittest是python内置的单元测

    2024年02月13日
    浏览(20)
  • python技术栈之单元测试中mock的使用

    mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 特别是开发过程中上下游未完成的工序导致当前无法测试,需要虚拟某些特定对象以便测试。 unittest是python内置的单元测试库,在做接口测试时,如果开

    2024年02月08日
    浏览(22)
  • 在Java微服务项目中,如何使用Mock来进行单元测试?

    摘要: 在系统开发的过程中,单元测试是其中的一个重要环节。在Java微服务项目中,Spring框架本身就为我们提供了一套单元测试的框架SpringBootTest。如果我们在学校完成课堂作业或出于兴趣爱好自学,是可以使用Spring自带的单元测试框架进行单测的。 工作中,这种通过Spri

    2024年02月16日
    浏览(20)
  • Spring Boot单元测试使用MockBean注解向Service注入Mock对象

    我们在测试时有一个Service,我们需要测试Service,但Service内部依赖ServiceA、ServiceB,此时我们希望Mock ServiceA,ServiceB 注入真实对象。 在Spring Boot Test中使用@Spy注解标记Service对象,但是其余真实对象无法注入,因为@Spy注解只能部分模拟对象,而无法注入真实对象。在这种情况下

    2024年02月13日
    浏览(19)
  • spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用

    spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用 好大一批新用法,大家静下心来好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模拟返回值 Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常…

    2024年02月15日
    浏览(29)
  • 单元测试与Mock

    作者:一笑钦陈 邮箱:xianqin_chen@163.com 你好,我是一笑钦陈,《零零后程序员成长之路》作者,一线互联网 Java 工程师。很高兴你阅读我的博客,让我们共同成长进步! 提醒:在接下来您对本博客的阅读中,如果遇到一些内容、图稿、代码等中的勘误都可以通过邮件进行反

    2024年02月08日
    浏览(36)
  • 单元测试junit+mock

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通常和白盒测试联系到一起 ,如果单从概念上来讲两者是有区别的,不过我们通

    2024年02月08日
    浏览(40)
  • Testify Mock 单元测试

    Testify 提供了单测方便的断言能力,这里的断言是将对代码实际返回的断言,代码的实际输出和预期是否一致。下面是 gin-gonic/gin 代码库的单测代码,Testify 还提供了很多其他的方法: 单元测试中也会存在不稳定的代码,我们的入参虽然保持不变,但每次单测的结果可能会发

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包