我有这样的方法:
public void someMethod() {
A a = new A(); // Where A is some class.
a.setVar1(20);
a.someMethod();
}
我想测试两件事:
Var1
成员变量的值为20. someMethod()
只调用一次。我有两个问题:
答案 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)您可以使用@Spy
和verify()
来测试方法的调用。
A spy = spy( a );
verify( spy , times( 1 ) ).someMethod();
您的示例代码有点简洁,所以我的答案很一般 - 希望您能使用它。
干杯,