#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()));, этот ответ дал его мне, после прочтения и многих попыток.