使用Mockito测试void方法

时间:2015-05-12 10:25:11

标签: java mockito

我有这样的方法:

public void someMethod() {
  A a = new A(); // Where A is some class.
  a.setVar1(20);
  a.someMethod();
}

我想测试两件事:

  1. a的Var1成员变量的值为20.
  2. someMethod()只调用一次。
  3. 我有两个问题:

    1. 这些测试目标是正确的还是我应该测试其他东西?
    2. 我究竟如何使用Mockito进行测试?

3 个答案:

答案 0 :(得分:3)

你无法使用Mockito进行测试,因为Mockito无法访问代码创建的局部变量,然后超出范围。

如果A是您所测试的类或被测试方法的注入依赖项,则可以测试该方法

public class MyClass {
    private A a;

    public MyClass(A a) {
        this.a = a;
    }

    public void someMethod() {
        a.setVar1(20);
        a.someMethod();
    }
}

在这种情况下,你可以创建一个模拟A,然后使用这个模拟A创建一个MyClass实例,调用该方法并验证模拟A是否已被调用。

使用您的代码,测试代码的唯一方法是验证调用someMethod()对A的变量等于20的副作用。如果A.setVar1()和{{1没有任何副作用,那么代码是无用的:它创建一个对象,修改它,并忘记它。

答案 1 :(得分:2)

使用JB Nizet的建议,但请注意,订单对您很重要:

验证和订购很重要时,请使用:

A mock = mock(A);

new MyClass(mock).someMethod();

InOrder order = inOrder(mock);
order.verify(mock).setVar1(20);
order.verify(mock).someMethod();

(只测试一次调用是mockito的默认设置)。

注意

这种测试将与实施紧密结合。所以要适度这样做。通常的目的是在可能的情况下测试状态而不是实现

答案 2 :(得分:1)

广告1)测试制定者通常没有多大意义,但是如果你想确定你在A上有一个吸气剂来验证var1是否设置为20?

广告2)您可以使用@Spyverify()来测试方法的调用。

A spy = spy( a );
verify( spy , times( 1 ) ).someMethod();

您的示例代码有点简洁,所以我的答案很一般 - 希望您能使用它。

干杯,