Я пишу модульный тест для метода со следующей соответствующей структурой:
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();
}
}
});
Это, конечно, теперь вызывается в классе Test перед вызовом testObj.foo ().
Мне показалось странным, что это заставило меня обернуть метод в три-ловушку там (в Ожиданиях), поскольку это просто устанавливает ожидания и не должно вызывать этот метод, верно?
Что ж, в моем отчете о Junit этот тест не проходит в этой строке в Ожиданиях Так что кажется, что это там вызывается.
Если я удаляю Assert.fail () в Expectations и игнорирую там исключение, тест проходит, когда baz () вызывается так, как задумано через foo ().
Итак:
1) Почему baz () вызывается из блока Expectations? В этом случае он фактически вызывается дважды, что кажется странным, и я не понимаю, почему мы этого хотим.
2) Почему я должен обернуть baz () в try-catch в блоке Exception? Я полагаю, что цель состоит не в том, чтобы вызвать его, а в том, чтобы просто заявить, что он может быть вызван произвольное количество раз или вообще не вызываться, а не в том, чтобы фактически вызвать его. Так что тогда не должно быть возможности выбросить туда исключение.