当前位置: 首页 > 知识库问答 >
问题:

为什么模拟测试框架有帮助?

卓新知
2023-03-14
public int add(int a, int b) {return a+b}

我将简单地使用JUnit来断言传入的两个整数是否会得到正确的输出。

在我看到的所有关于Mockito的示例中,人们都在执行类似when.object.add(2,3).thenreturn(5)的操作。如果您所做的只是告诉对象如何在测试端而不是对象端进行操作,那么使用这个测试框架有什么意义呢?

共有1个答案

陈淳
2023-03-14

模拟框架通过模拟系统的依赖关系来测试系统是很好的;如果您正在测试add,则不会使用模拟框架来模拟或存根add。让我们进一步讨论一下:

模拟框架不利于测试上面的add方法。除了非常稳定和经过非常好测试的JVM和JRE之外,没有其他依赖关系。

public int add(int a, int b) {return a+b}

但是,如果您的add方法与另一个对象交互,那么它可能对测试add方法有好处:

public int add(int a, int b, AdditionLogger additionLogger) {
    int total = a + b;
    additionLogger.log(a, b, total);
    return total;
}
@Test public void yourTest() {
    assertEquals(5, yourObject.add(2, 3, mockAdditionLogger));
    verify(mockAdditionLogger).log(2, 3, 5);
}

不过,让我们给你的对象另一种方法,它用一点点随机噪声将两个数字相加:

public int addWithNoise(int a, int b) {
    int offset = new Random().nextInt(11) - 5;  // range: [-5, 5]
    int total = a + b + offset;
    return total;
}

因此,您可能很难针对此方法编写一个健壮的assert样式的测试;毕竟,结果会有点随机!相反,为了使assert样式的测试更容易,也许我们可以省略AddWithNoise,使某些测试更可预测。

@Test public void yourTest() {
    when(yourObjectMock.addWithNoise(2, 3)).thenReturn(6);
    // You're not asserting/verifying the action you stub, you're making the dependency
    // *fast and reliable* so you can check the logic of *the real method you're testing*.
    assertEquals(600, systemUnderTestThatConsumesYourObject.doThing(yourObjectMock));
}

在与诸如add之类的众所周知的操作或诸如list之类的众所周知的接口交互时,解释嘲弄和模拟语法可能会更容易,但这些示例通常不是需要模拟的实际情况。请记住,当您不能使用真实的依赖项时,模拟仅对模拟您的被测试系统周围的依赖项才真正有用。

 类似资料:
  • 问题内容: 在Java中创建模拟对象的最佳框架是什么?为什么?每个框架的优缺点是什么? 问题答案: 我使用Mockito取得了成功。 当我尝试学习JMock和EasyMock时,我发现学习曲线有些陡峭(尽管也许就是我自己)。 我喜欢Mockito,因为它的语法简洁明了,我很快就能掌握。最小的语法旨在很好地支持常见情况,尽管几次我需要做一些更复杂的事情,但我发现我想要的东西是受支持的并且易于理解。

  • 2024 年的今天,还有人对 electron 进行 e2e 测试吗?有什么推荐的框架吗?

  • 我很难在Java项目中使用Spock框架进行测试。我有以下内容: 但是,对于我的具体情况,我需要指定我传入的Person对象,并为其分配一个特定的MockReturnObject。比如: 或 这两种方法都不起作用,调用最终返回null而不是MockReturnObjectA(我认为这是因为它无法匹配参数)。不幸的是,我对Spock没有太多的经验,我试图搜索关于在这种情况下处理地图的文档,但没有取得

  • 测试框架工具 Karma Intern NightWatch.js

  • Spring是一个控制反转和面向切面的容器框架。 Spring有七大功能模块: 1、Core Core模块是Spring的核心类库,Core实现了IOC功能。 2、AOP Apring AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常见的拦截器,供用户自定义和配置。 3、orm 提供对常用ORM框架的管理和支持,hibernate、mybatis等。 4、Dao Sprin