我正在使用EasyMock 3+。
我正在测试一种方法,例如processMessage()
,它(会)满足我的测试,但在方法的最后,这个方法也调用了同一个类的另一个方法dispatchMessage(String msg)
。后一种方法采用@EJB注入的对象,我在这个测试中并不关心。当然 - 这个对象导致NullPointerException。
我如何用Easymock模拟这种方法来简单地忽略它的代码并返回void。即。
void dispatchMessage(String msg){
return;
}
感谢
答案 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)
无需调用replay
或verify
。我是这样做的。添加了@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());
}
当然,如果我省略了部分模拟,它会抛出一个空指针异常,如最初描述的那样。现在,它不再这样做了。都好。