Проверка ошибок обработки метода странности с Junit5 и mockito - PullRequest
0 голосов
/ 24 апреля 2019

Я делаю модульные тесты для метода, который выполняет некоторую обработку исключений.вот упрощенный класс, который я хотел бы проверить:

class Foo{

    private BarService bar;

    public int MethodToTest(){

        try{
            bar.methodThatThrows();
            return 1;
        }catch(Exception e){
            return 0;
        }
    }
}

И это класс модульного тестирования.

class FooTest{

    private IBarService barService = mock(BarService.class);

    @Test
    TestMethodToTest(){

        when(barService.methodThatThrows()).thenThrow(new Exception("message");
        Foo foo = new foo();
        ReflectionTestUtils.setField(foo, "barService", barService);
        assertEquals(foo.MethodToTest(), 0);
    }
}

Каким-то образом, когда я его запускаю, он терпит неудачу, потому что естьвыдается ошибка (как и ожидалось), в которой содержится точно такое же сообщение, что и сообщение, которое я помещаю в проверяемый сервис.Когда я запускаю в режиме отладки, блок catch даже не запускается.Как это может быть возможно?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Скорее всего, в вашем тесте выдается проверенное исключение, которое не объявлено для methodThatThrows

Сообщение, которое вы объявили в своем тесте, действительно выводится на консоль, но оно более информативно:

org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: java.lang.Exception: message

Например (IOException, объявленное в BarService, но более общее проверенное исключение, генерируемое в тестовом коде):

public class BarService {
    public int methodThatThrows() throws IOException {
        return 1;
    }
}
0 голосов
/ 24 апреля 2019

Вы не правильно установили BarService в своем примере кода.Вы делаете:

ReflectionTestUtils.setField(foo, "barService", barService);

Но в классе Foo переменная BarService называется "bar", а не "barService", поэтому вам нужно сделать:

ReflectionTestUtils.setField(foo, "bar", barService);

Хотя «правильный» способ сделать это - использовать Spring для автоматической передачи BarService в Foo, что позволяет избежать необходимости использовать ReflectionTestUtils в первую очередь.

...