EasyMock:无效方法

我有一个方法返回类是我想要testing的类的依赖类的无效。

这个类是巨大的,我只用它从这个单一的方法。 我需要replacetesting的这个方法的实现,因为我希望它做一些不同的事情,我需要能够访问这个方法接收的参数。

我无法在EasyMock中find这种方法。 我想我知道如何使用doAnswer来处理doAnswer但除非绝对必要,否则我不想添加其他库。

如果我明白你想做的正确,你应该可以使用andAnswer()

 mockObject.someMethod(eq(param1), eq(param2)); expectLastCall().andAnswer(new IAnswer() { public Object answer() { //supply your mock implementation here... SomeClass arg1 = (SomeClass) getCurrentArguments()[0]; AnotherClass arg2 = (AnotherClass) getCurrentArguments()[1]; arg1.doSomething(blah); //return the value to be returned by the method (null for void) return null; } }); 

EasyMock用户指南解释:

创build返回值或例外

有时我们希望我们的模拟对象返回一个值,或者抛出一个在实际调用时创build的exception。 由于EasyMock 2.2, expectLastCall()expect(T value)返回的对象提供了方法和andAnswer(IAnswer answer) ,它允许[你]指定一个用于创build返回值或exception的接口IAnswer的实现。

IAnswercallback中,传递给模拟调用的参数可以通过EasyMock.getCurrentArguments() 。 如果你使用这些,像重新sorting参数的重构可能会破坏你的testing。 你被警告了。

如果你每次调用void方法都要调用,然后在调用replay()之前调用EasyMock.expectLastCall() replay() ,Easymock将会“记住”每个调用。

所以我不认为你需要显式调用expect() (除lastCall ),因为除了调用之外,你并不期望从void方法中得到任何东西。

谢谢Chris!

由StackOverflow用户“与EasyMock一起玩” Burt Beckwith是一篇很好的博客文章,提供了更多的细节。 着名的摘录:

基本上我倾向于使用的stream程是:

  1. 创build一个模拟
  2. 调用expect(mock.[method call]).andReturn([result])为每个预期的呼叫
  3. 调用mock.[method call] ,然后EasyMock.expectLastCall()为每个预期的void调用
  4. 呼叫replay(mock)从“logging”模式切换到“重放”模式
  5. 根据需要注入模拟
  6. 调用testing方法
  7. 呼叫verify(mock)以确保所有预期的呼叫发生

如果您只想稍后访问参数,则可能还会欣赏EasyMock 2.4新增的“ 捕捉”类。

您可以使用“Capture”类的实例来代替匹配器。 当你的模拟方法被调用时,Capture实例将存储它被调用的参数。

 Capture<ChartPanel> captured = new Capture<ChartPanel>(); // setChartPanel is going to be called during execution; // we want to verify some things about the ChartPanel // instance it's invoked with chartMock.setChartPanel(capture(captured)); replay(chartMock); ufdm.setChartAnnotater(chartMock); // afterPropertiesSet triggers the setChartPanel call... ufdm.afterPropertiesSet(); verify(chartMock); // verify some things about the ChartPanel parameter our // mock object was invoked with assertSame(plot, captured.getValue().getChart().getPlot()); 

你可能想看看PowerMock。 EasyMock是基于代理reflectionAPI的意思,一切都是代理,你只能testing接口,因此只有非最终的方法和类。 这可能对一些人有用,但是如果你正在testingbuild成的世界,你将需要更多的权力。

借助PowerMock,Java 5 Instrumentation API消除了这些限制。 不需要写testing对象的模拟对象实现(只是丑陋的海事组织)。 与Mockito(或JMockit)的夫妇PowerMock,你真的会跑到比赛。

当然,重写代码的另一个方向是更容易testing,如果可能的话,这也是一个好主意。

在这样的情况下,我发现在我的unit testing类中创build一个嵌套类,并以这种方式覆盖具有特殊要求的方法是最好的路线。 因此,如果您使用需要访问的参数testing具有该方法的ClassA ,则可以执行以下操作:

 class MockClassA extends ClassA { @Override void specialMethod(String param1, String param2) { // do logging or manipulation of some sort super.specialMethod(param1,param2); // if you need to } } 

在我的unit testing代码中,我只是使用这个实例。 把它当作是任何其他的模拟对象。 比混合库更容易,我同意这可能不是一个好主意。