我正在为具有以下相关结构的方法编写单元测试:
void foo(Obj bar) {
//...some logic...
bar.baz();
}
现在,bar.baz()可以引发IOException。如果发生这种情况,则测试将失败。所以我有:
@Test
public void test() {
ObjectToTest testObj = new ObjectToTest();
try {
testObj.foo();
} catch (IOException e) {
Assert.fail();
}
}
此操作失败,并意外调用baz()。好的,所以我有
mockery.checking(new Expectations() {
{
try {
allowing(mockBarInstance).baz();
} catch (IOException e) {
Assert.fail();
}
}
});
这当然现在在调用testObj.foo()之前在Test类中调用。
我以为这使我将方法包装在try-catch中(在Expectations中)感到很奇怪,因为这只是设置期望值,不应调用此方法,对吗?
在我的junit报告中,此测试在Expectations的那条线上失败。因此,似乎在这里对其进行了调用。
如果我删除了Expectations中的Assert.fail()并忽略了那里的异常,则通过foo()按预期方式调用baz()时,测试将通过。
所以:
1)为什么要从Expectations块中调用baz()?在这种情况下,它被有效地调用了两次,这看起来很奇怪,我不明白为什么要这么做。
2)为什么我必须在异常块的try-catch中包装baz()?我相信它的目的不是要调用它,而只是说它可以被调用任意次或根本不被调用,而不是实际调用它。因此,在那里应该不可能引发异常。