我是Mockito和PowerMock的新手,我真的遇到了麻烦。这几乎是我的情况:
class A {
static class B {
public class B(Object1 o1, Object2 o2) {
setInSuperClass(o1); // this is private method...
doSomethingWithInnerClass (new Object3() {
@Override
public void retreat() {
someVar = new Object5(o2); // someVar is from superclass and is private, I know I can get it with PowerMock
}
@Override
public boolean doSomething(){
return true;
}
})
}
}
}
我想这可以完成第一个方法的工作....也许我也可以验证某个对象是否在超类中设置并且不再为null,那会没事的吗?
@Mock
Object1 o1;
@Mock
Object2 o2;
public void test() {
B b = new B(o1, o2);
PowerMockito.verifyPrivate(b).invoke("setInSuperClass", 1 , o1);
}
但如何最好地测试doSomethingWithInnerClass ???我的意思是,我知道我可以验证它被调用....但这个匿名类参数我想测试。 我很感激建议, 感谢名单
答案 0 :(得分:1)
我相信你需要改变你的想法。例如,您应该验证调用的结果,而不是验证使用Powermock调用setInSuperClass
。有没有设置的字段?这个领域有吸气剂吗?是否有一些由此字段驱动的其他行为可以验证?
doSomethingWithInnerClass
也是如此。一个不做任何事情的方法调用也可能不存在。必须有通话结果。一些输出,调用另一个方法/类或副作用。验证结果。
如果这确实不可能,您可能需要创建内部类的子类以进行测试。该子类将覆盖被测试方法调用的方法。
答案 1 :(得分:0)
您不应该验证私有变量是否已设置。您应该验证对对象的后续行为产生的影响。因此,为了运行retreat
方法,您需要做什么,然后在封闭对象上调用其他方法,该方法使用该私有变量的值。
如果无法从封闭对象中判断变量已经设置,那么这表明变量本身并不是真正需要的。