覆盖void-method的内容

时间:2015-06-22 14:18:32

标签: testng easymock

我正在使用EasyMock 3+。

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

我如何用Easymock模拟这种方法来简单地忽略它的代码并返回void。即。

void dispatchMessage(String msg){
     return;
}

感谢

4 个答案:

答案 0 :(得分:2)

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

让我们假设以下课程:

create or replace trigger tdroptest before drop on schema
  when (ora_dict_obj_name = 'TEST' and 
        ora_dict_obj_type = 'TABLE' and
        ora_dict_obj_owner = 'SYSTEM'
       )
declare
    c integer;
begin
    select count(*) into c from system.test;
    if (c <= 10) then
      raise_application_error(-20001,'Table cannot be deleted');
    end if;
end;

为了仅测试方法public class ClassUnderTest { @EJB private SomeEJB someEJB; public void processMessage() { dispatchMessage("some message"); } public void dispatchMessage(String msg) { someEJB.dispatch(msg); } } ,您可以模拟processMessage

dispatchMessage

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

基本上你需要做

mockObject.dispatchMessage(Easymock.anyObject(String.class));
Easymock.expectLastcall();
希望它有所帮助!

祝你好运!

答案 3 :(得分:0)

无需调用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();

此代码后面会调用测试中的方法(原始目标)......

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

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