轻松上手:空洞方法

2022-08-31 14:31:38

我有一个方法,它在一个类中返回void,该类是我要测试的类的依赖项。

这个类很大,我只使用它的单一方法。我需要为测试替换此方法的实现,因为我希望它做一些不同的事情,并且我需要能够访问此方法接收的参数。

我无法在EasyMock中找到做到这一点的方法。我想我知道如何通过使用doAnswer来使用Mockito做到这一点,但除非绝对必要,否则我不想添加另一个库。


答案 1

如果我正确地理解了你想做什么,你应该能够使用: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 用户指南解释道:

创建返回值或异常

有时,我们希望模拟对象返回一个值或引发在实际调用时创建的异常。从 EasyMock 2.2 开始,expectLastCall()expect(T value) 返回的对象提供了方法和答案(IAnswer answer),它允许 [您] 指定用于创建返回值或异常的接口 IAnswer 的实现。

IAnswer 回调中,传递给模拟调用的参数可通过 EasyMock.getCurrentArguments() 获得。如果使用这些参数,则重新排序参数等重构可能会破坏测试。你已被警告。


答案 2

如果你只是在每次你期望它被调用时调用void方法,然后在调用之前调用,Easymock将“记住”每个调用。EasyMock.expectLastCall()replay()

因此,我认为您不需要显式调用(除了),因为除了它的调用之外,您不会期望从void方法中获得任何东西。expect()lastCall

谢谢克里斯!

StackOverflow用户Burt Beckwith“Fun With EasyMock”是一篇很好的博客文章,提供了更多细节。值得注意的摘录:

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

  1. 创建模拟
  2. 每个预期呼叫的呼叫expect(mock.[method call]).andReturn([result])
  3. 调用 ,然后对于每个预期的 void 调用mock.[method call]EasyMock.expectLastCall()
  4. 调用以从“录制”模式切换到“播放”模式replay(mock)
  5. 根据需要注入模拟
  6. 调用测试方法
  7. 呼叫以确保所有预期的呼叫都已发生verify(mock)