我对PowerMock/EasyMock的世界比较陌生,而我认为应该相对直接的东西应该是不起作用的。也许有人可以告诉我我要去哪里错了。需要一些基本的PowerMock/EasyMock问题的一些帮助
考虑这两个类:
public class Foo
{
public int doStuff(int a)
{
return (5/a);
}
}
public class Bar
{
public void doSomething()
{
Foo foo = new Foo();
int c = foo.doStuff(0);
}
}
现在,测试类,我想测试的杆法DoSomething的。我得到的问题是它使用Foo。正如你所看到的,将0传递给Foo将导致被零除错误。我想将/ Foo.doStuff()取消/压缩,以防止这种情况发生。我真正需要做的是确保doStuff()实际上被调用。所以,我已经这样做了:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Foo.class })
public class TestStuff
{
@Test
public void testOtherStuff() throws Exception
{
Foo fooMock = PowerMock.createMock(Foo.class);
expectNew(Foo.class).andReturn(fooMock);
EasyMock.expect(fooMock.doStuff(anyInt())).andReturn(1);
//fooMock.doStuff(anyInt());
//suppress (method(Foo.class, "doStuff"));
replayAll();
Bar bar = new Bar();
bar.doSomething();
verifyAll();
}
}
当我运行这个时,我得到除零除异常。我曾经想过使用expect()调用,并指定返回值1会阻止该方法执行。这显然不是这种情况。所以第一个问题是,为什么不呢?
所以然后我试着做上面评论的陈述。也就是说,我将expect()调用注释掉了,并使用了另外两个语句,认为我必须禁止该方法的执行。我发现如果我没有执行suppress()语句,我总是会得到被零除的例外。但是,通过在那里设置抑制语句,我得到一个断言错误,它表示doStuff预计称为1次,实际调用为0.
那么,为什么不将方法计算为执行?
如何获得模拟的东西来“存根”的方法,以便它被视为被执行通过没有真的做任何事情?
我一直在处理的情况实际上在doStuff上有无效回报。如何处理没有返回值的方法所需的模拟语句与之相比有什么不同?
看起来好像我在做这项工作的风口浪尖上,但我觉得我在这里尝试了一些不正确的陈述组合。我已经在这方面打了我的脑袋,阅读了大量的例子,但我仍然缺乏。
任何帮助?
感谢,
克雷格
testOtherStuff方法已包含您描述的调用createMock和expectNew。 – krock 2011-03-11 23:59:19
哇。当我改变PrepareForTest来使用Bar类而不是Foo类时,它实际上起作用了。显然,我一直在准备错误的课程。惊人。非常感谢! – 2011-03-12 00:16:59
@ krock,非常真实。坏我。我更新了克雷格自己发现的解决方案,就这样在这里。 – 2011-03-12 00:23:40