как упомянуто @duffymo, имитация - путь.
Если бы вы действительно проводили модульное тестирование , то вы уже использовали бы Mocks, созданные с помощью среды моделирования, поскольку модульные тесты требуют изоляции отдельных модулей путем замены их зависимостей с тест удваивается . Фреймворк - самый простой и стабильный способ создания таких тестов, удваивается .
Но я думаю, что вместо этого вы Интеграционные тесты выполняются с UnitTesting Framework , называя их "модульными тестами" по любой причине.
Тем не менее ..
Поскольку ваш тест основан на реальной функциональности источников данных, шпион будет хорошим выбором, например:
class DatasourceUsageTest{
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void reportDatabaseOutage(){
// arrange
DataSource myDatasource = aquireDatasourceSomehow();
DataSource spyOfMyDatasource = Mockito.spy(myDatasource);
Mockito.doCallRealMethod() // first call
.doThrow(new SqlException("Report this message") // second call (and all following)
.when(spyOfMyDatasource).methodExpectedToFail();
SomeType testedUnit = createUnitAndInject(spyOfMyDatasource );
// act call #1
testedUnit.theMethodUsingDatasource();
Mockito.verify(spyOfMyDatasource).methodExpectedToFail();
// act call #2
exception.expect(TheExceptionTypeToBeThrown.class);
exception.expectMessage(EXCEPTION_MESSAGE_PREFIX + "Report this message");
testedUnit.theMethodUsingDatasource();
// Code below this will not be executed
}
}
Проблема здесь (как с любым интеграционным тестом ) заключается в том, что ваша база данных может иметь реальную проблему, и в этом случае этот тест завершается неудачно при вызове # 1 (и, следовательно, по неправильной причине).