覆盖无效方法的内容

override a void-method's content

我正在使用 EasyMock 3+。

我正在测试一种方法,例如processMessage(),这(将)满足我的测试,但在该方法的最后,此方法还调用了相同 class 的另一个方法 dispatchMessage(String msg)。后一种方法采用 @EJB 注入对象,在这个测试中我真的不关心它。当然 - 此对象会导致 NullPointerException。

我如何使用 Easymock 模拟此方法以简单地忽略它的代码和 return 无效。即

void dispatchMessage(String msg){
     return;
}

谢谢

对于模拟 void 方法,expectLastCall() 方法很有用,在这种情况下您不需要 return 任何东西,因为 return 类型是 void

基本上你需要做

mockObject.dispatchMessage(Easymock.anyObject(String.class));
Easymock.expectLastcall();

希望对您有所帮助!

祝你好运!

您可以使用 EasyMock 的部分模拟功能。

让我们假设以下 class:

public class ClassUnderTest {

    @EJB
    private SomeEJB someEJB;

    public void processMessage() {
        dispatchMessage("some message");
    }

    public void dispatchMessage(String msg) {
        someEJB.dispatch(msg);        
    }
}

为了只测试方法 processMessage 你可以模拟 dispatchMessage:

import org.easymock.EasyMockSupport;
import org.junit.Test;

public class ProcessMessageTest extends EasyMockSupport {

    @Test
    public void processMessage() throws Exception {
        ClassUnderTest classUnderTest = createMockBuilder(ClassUnderTest.class)
            .addMockedMethod("dispatchMessage")
            .createMock();  
        classUnderTest.dispatchMessage("some message");
        replayAll();

        classUnderTest.processMessage();

        verifyAll();
    }

}

另一种选择是使用 PowerMock 框架,它与 EasyMock 配合得非常好,并且具有一些您可能会感兴趣的附加功能(例如模拟新对象创建或静态方法调用):https://code.google.com/p/powermock/wiki/MockPrivate

无需调用 replayverify。我是这样做的。添加了 @BeforeClass 注释。

InboundMDB inboundMock;

@BeforeClass
public void beforeClass() {
    inboundMock = new InboundMDB();
}

然后创建了一个 EasyMock 构建器实例并添加了我不感兴趣的方法。现在,thi

IMockBuilder<InboundMDB> iMockBuilder = EasyMock
                .createMockBuilder(InboundMDB.class);
        inboundMock = iMockBuilder.addMockedMethod("dispatch")
                .createMock();

后面是调用被测方法的代码(原objective)...

try {
        inboundMock.processMessage(aMessage);
    } catch (Exception e) {
        Assert.fail(e.getMessage());
    }

当然,如果我省略部分模拟,它会像最初描述的那样抛出一个空指针异常。现在,它不再这样做了。都好。