Исключение, проверенное Mockito, недопустимо для этого метода

#java #unit-testing #mockito

#java #модульное тестирование #исключение #mockito

Вопрос:

Я получаю ошибку Checked exception is invalid for this method при попытке использовать этот макет:

 InitialContext mockContext;
mockContext = mock(InitialContext.class);
when((DataSource) mockContext.lookup("java:comp/env/jdbc/foo")).thenThrow(new ConnectionFactoryException("test")); // <-- Fails on this line

@Test
public void shouldThrowExceptionIfDataSourceDoesNotExist() throws ConnectionFactoryException {
    assertThatExceptionOfType(ConnectionFactoryException.class)
        .isThrownBy(() -> { new DataSourceFactory(mockContext).getDataSource("foo"); })
        .withMessage("Unable to find jdbc/foo");
}
  

Класс, который я пытаюсь протестировать:

 public class DataSourceFactory {

    // Dependencies to be injected
    private InitialContext context;

    public DataSourceFactory(InitialContext context) throws ConnectionFactoryException {

        if(context == null) {
            throw new ConnectionFactoryException("context can't be null");
        }

        this.context = context;
    }

    public DataSource getDataSource(String dataSourceName) throws ConnectionFactoryException {

        if(dataSourceName == null) {
            throw new ConnectionFactoryException("dataSourceName can't be null");
        }

        // Ensure we have the correct syntax for the datasource name
        if(!dataSourceName.startsWith("jdbc/")) {
            dataSourceName = "jdbc/"   dataSourceName;
        }

        try {
            System.out.println("java:comp/env/"   dataSourceName);
            DataSource dataSource = (DataSource) context.lookup("java:comp/env/"   dataSourceName);
            return dataSource;
        } catch (NamingException e) {
            throw new ConnectionFactoryException("Unable to find "   dataSourceName, e);
        }
    }
}
  

Я знаю, я читал, что я не должен издеваться над объектами, которые мне не принадлежат, но я не могу понять, как протестировать getDataSource() метод без издевательства InitialContext .

Ответ №1:

lookup действительно, не выдает ConnectionFactoryException — ваш код выдает. Вместо этого вы должны создать правильное исключение — a NamingException и проверить, что ваш код обрабатывает его как ожидалось (т. Е. вызывает исключение ConnectionFactoryException`):

 when(mockContext.lookup("java:comp/env/jdbc/foo"))
    .thenThrow(new NamingException("test"));
  

Комментарии:

1. Чего я не понимал, так это того, что вам нужно принудительно создать исключение в вашем коде, установив правильные условия, ЗАТЕМ assertThrows(YourException.class , () -> { service.methodThrowingException()));, этот ответ дал его мне, после прочтения и многих попыток.