【问题标题】:Verify a void method was called inside a private method with EasyMock/PowerMock使用 EasyMock/PowerMock 验证在私有方法中调用了 void 方法
【发布时间】:2016-06-08 15:10:43
【问题描述】:

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

private boolean x = someMethodToSetTheValueOfX();

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

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

我不允许使用除 EasyMock/PowerMock 之外的其他框架(如 Mockito)。

【问题讨论】:

  • 以防万一:如果您需要更多信息以找到我的回答有帮助,请告诉我;否则请不要忘记接受答案;-)

标签: java mocking powermock easymock


【解决方案1】:

您可以使用:

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

如果您可以在 Eclipse 等 IDE 中打印到控制台,或者使用:

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

并将它们放在method1中

【讨论】:

  • 我认为您误解了这个问题。它是关于单元测试的(比如,JUnit 测试)。与故障排除无关。但否则是的,我会做第一个:)
【解决方案2】:

你弄错了;这不是你应该设计测试的方式。

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

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

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

你做了什么:

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

b)您创建“被测类”的对象......然后在这些对象的属性上“断言”;或方法调用返回的结果。

【讨论】:

  • 也不是说通过使用 PowerMock 您正在更改被测单元。因此,您实际上并没有测试您的测试类,而是在生产中不会看到的东西。
猜你喜欢
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2011-04-12
相关资源
最近更新 更多