我对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()语句,我总会得到除零异常。但是,通过在那里使用suppress语句,我得到一个断言错误,它说doStuff预计会被调用一次,而实际的调用是0。
那么,为什么这个方法算不算执行?
我如何让模拟内容“存根”该方法,以便它被视为执行时没有真正做任何事情?
我一直在处理的情况实际上在doStuff上有一个void返回。对于没有返回值的处理方法,如何处理必要的模拟语句与那些做什么?
不同似乎我正处于开展这项工作的尖端,但我觉得我在这里尝试了一些不正确的语句组合。我已经开始关注这个问题,阅读了一些例子,我仍然很短暂。
任何帮助?
谢谢,
克雷格
答案 0 :(得分:3)
从PowerMock文档中查看此内容:http://code.google.com/p/powermock/wiki/MockConstructor
类似的东西:
Foo fooMock = createMock(Foo.class);
expectNew(Foo.class, 0).andReturn(fooMock);
编辑:添加文档的真实相关部分(Craig自己找到):
使用@PrepareForTest( ClassThatCreatesTheNewInstance .class) 在类的级别注释 测试用例。