使用 EasyMock/PowerMock 验证在私有方法中调用了 void 方法

Verify a void method was called inside a private method with EasyMock/PowerMock

我有一个看起来像这样的方法(简化)

private boolean x = someMethodToSetTheValueOfX();

private void method(args){
        if(x){
             method1();
        }else{
             method2();
        }
}

我想写一个单元测试来保证当x为真时,方法1被调用。我知道我可以使用 PowerMock 的 Whitebox 来设置 x 的值并调用方法,但是我如何确认 method1() 被调用了?请注意,method1() 是无效的。

除了EasyMock/PowerMock.

,我不允许使用其他框架(如Mockito)

你理解错了;那不是您设计测试的方式。

首先:小心使用 PowerMock... 框架。他们依赖于字节码操作;这迟早会带来麻烦。对用户 PowerMock(ito) 来说,唯一合理的情况是您必须测试遗留生产代码。在任何其他情况下:更改您的生产代码以便轻松测试它。

那么:不要这样测试你的代码!

您使用模拟框架 create/control 您传递给“class 被测对象”的那些对象。你不使用框架直接测试你的“class被测”!更具体地说:您不想编写了解私有方法的测试代码 - 这些是实现细节。

你做了什么:

a) 如前所述,您可以使用模拟将对象传递到您的 class 被测对象中。然后你可以 control/verify 这些模拟看到你期望你的“class under test”进行的调用。因此,最坏的情况是,您可以将 method1/2 放在不同的对象上;然后您可以使用 mock/verify 检查它们是否按预期被调用。

b) 你创建了你的“class under test”的对象……然后对这些对象的属性进行“断言”;或方法调用 return.

的结果

您可以使用:

System.out.println("method one was called"); 

如果您可以在像 eclipse 这样的 IDE 中打印到控制台,或者使用:

JOptionPane.showMessageDialogue(null, "method one was called");

并将它们放入方法 1