我对 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);
}
}
现在,在测试类中,我想测试 Bar 方法 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 有一个无效的回报。对于处理没有返回值的方法,与那些有返回值的方法相比,必要的模拟语句有何不同?
似乎我正处于完成这项工作的风口浪尖,但我觉得我在这里尝试了某种不正确的陈述组合。我已经对此深有感触,阅读了一堆示例,但仍然不足。
有什么帮助吗?
谢谢,
克雷格