2016-06-08 91 views
1

的私有方法里面我有一个看起来像这样(简化)的方法验证一个void方法调用了EasyMock/PowerMock

private boolean x = someMethodToSetTheValueOfX(); 

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

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

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

+0

以防万一:让我知道你是否需要更多的信息来找到我的答案有帮助;否则请不要忘记接受答案;-) – GhostCat

回答

1

你是错了;这不是你应该如何设计你的测试。

首先:请不要使用任何PowerMock ...框架。他们依靠字节码操作;迟早会招来麻烦。相信我,我花了很多时间去寻找真正奇怪的错误,没有任何理由。

然后:不要这样测试你的代码!

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

你做什么,而不是:

一)正如所说,你可以用嘲讽的对象传递到你的类测试。然后你可以控制/验证那些模拟看到你期望你的“受测试的类”所做的调用。所以,最坏的情况下,你可以把method1/2放在不同的对象上;然后你可以使用模拟/验证来检查它们是否按预期调用。 b)你创建你的“正在测试的类”的对象......然后对这些对象的属性进行“断言”;然后,或者方法调用返回的结果。

+0

也不是通过使用PowerMock你正在改变被测试的单位。所以你实际上并不是在测试你的班级,而是在生产中看不到的东西。 – SpaceTrucker

1

您可以使用:

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

如果您可以打印到康寿像日食,或使用一个IDE:

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

,并把他们的内部方法1

+0

我想你误解了这个问题。这是关于单元测试(如JUnit测试)。不涉及故障排除。但否则是的,我会做第一个:) – Steve