3

我是 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; 
            }

        })

    }
  }
}

我想这可以为第一种方法完成工作....也许我还可以验证某个对象是否设置在超类中并且不再为空,那可以吗?

    @Mock
    Object1 o1;

    @Mock
    Object2 o2;

    public void test() {
         B b = new B(o1, o2);
         PowerMockito.verifyPrivate(b).invoke("setInSuperClass", 1 , o1);
    }

但是如何最好地测试 doSomethingWithInnerClass ???我的意思是,我知道我可以验证它是否被调用......但是我想测试这个匿名类参数。我感谢建议,谢谢

4

2 回答 2

1

我相信你需要重新思考你的想法。例如setInSuperClass,您应该验证调用的结果,而不是使用 Powermock 验证调用。有设置的字段吗?这个领域有吸气剂吗?是否有其他一些可以验证的由该领域驱动的行为?

也是如此doSomethingWithInnerClass。不做任何事情的方法调用也可能不存在。调用必须有结果。一些输出,调用另一个方法/类或副作用。验证结果。

如果这确实不可能,您可能需要创建内部类的子类进行测试。该子类将覆盖被测试方法所调用的方法。

于 2013-10-28T09:27:20.913 回答
0

您不应该验证是否设置了私有变量。您应该验证对对象后续行为的任何影响。因此,请执行您需要执行的操作以运行您的retreat方法,然后在封闭对象上调用其他方法,该方法使用该私有变量的值。

如果无法从封闭对象中得知该变量已被设置,那么这表明我实际上并不需要该变量本身。

于 2013-10-29T01:42:56.133 回答