Почему Jmock выбрасывает исключение в блок ожидания? - PullRequest
0 голосов
/ 14 января 2019

Я пишу модульный тест для метода со следующей соответствующей структурой:

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? Я полагаю, что цель состоит не в том, чтобы вызвать его, а в том, чтобы просто заявить, что он может быть вызван произвольное количество раз или вообще не вызываться, а не в том, чтобы фактически вызвать его. Так что тогда не должно быть возможности выбросить туда исключение.

...