java - 在编写 Junit 测试时,Mockito.mock 比使用 new 有何优势?

标签 java junit mockito

<分区>

我是第一次编写 Junit 测试,并且是 Mockito 框架的新手。 在用 Java 编写 Junit 测试时,使用 Mockito.mock() 比使用 new 运算符创建实例有何优势?

最佳答案

Mockito 可用于注入(inject)当前测试上下文中可能不存在的依赖项,而不是创建用于测试的“虚拟”对象。这些模拟对象不是真实的东西,而是模拟类的“空”版本,您可以在其上运行 Mockito 提供的各种行为模拟和结果验证方法。

例如下面的类:

class Thing {
    //Some external Dependency which provides the method 'int doWork()'
    private Dependency dependency;
    private int value;
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
    public int getValue() {
        return value;
    }
    // Calculates something depending on the provided amount.
    public void calculate(int amount) {
        for(int i = 0; i < amount; i++) {
            value += dependency.doWork();
        }
    }
}

然后你可以在你的测试中做这样的事情:

@Test
public void should_calculate_five_times() {
    // Create mock object
    Dependency dependencyMock = Mockito.mock(Dependency.class);
    // Simulate the behaviour of the mock object
    Mockito.when(dependencyMock.doWork()).thenReturn(2);

    // Create object under test
    Thing thingToTest = new Thing();
    // Inject mock object
    thingToTest.setDependency(dependencyMock);
    // Execute method to test
    thingToTest.calculate(5);

    // Expected: dependency.doWork() should have been called 5 times
    Mockito.verify(dependencyMock, Mockito.times(5)).doWork();
    // Since dependencyMock returns 2, when doWork() is called, value should be 10
    Assert.assertEquals(10, thingToTest.getValue());
}

关于java - 在编写 Junit 测试时,Mockito.mock 比使用 new 有何优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215963/

相关文章:

java - 我可以删除 Java 6 而 Android 仍然可以工作吗?

java - Java中的字符串模式匹配

java - 无法使 PreferenceFragment 工作(编译错误)

java - 分段上传 Servlet 3.0 - 临时文件不删除

java - Maven 不运行 selenium 测试

java - junit 中的模拟 amazon web 服务请求/响应对象

java - 我如何使用 powermock stub Instant 对象

java - PowerMockito 和 CORBA 冲突

java - JUnit,参数化测试超时

java - 如何根据参数属性在 Mockito 中返回不同的值?