Я использую тестовую аннотацию, представленную в spring -boot 1.4.3, для своих интеграционных тестов.
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceIT { }
Согласно документации, тестовый контекст кэшируется и повторно используется для ускорения интеграционных тестов. Я хочу именно такого поведения, поскольку инициализация контекста приложения занимает значительное время. Мой отказоустойчивый плагин настроен с
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
чтобы разрешить выполнение интеграционных тестов в одном процессе, чтобы воспользоваться преимуществами кэширования контекста приложения.
Недавно я написал интеграционный тест с использованием аннотации @MockBean для имитации поведения некоторых bean-компонентов.
@RunWith(SpringRunner.class)
@SpringBootTest
public class AnotherServiceIT {
@MockBean
SomeService service1
}
Хотя тест работает нормально сам по себе, при запуске через maven verify несколько интеграционных тестов завершаются сбоем с сообщением об ошибке
javax.naming.NamingException: другой ресурс уже существует с именем dataSource - выберите другое имя
Если я пропущу этот конкретный тест с аннотацией JUnit @Ignore, все вернется в норму.
Такое поведение, по-видимому, указывает на то, что использование @MockBean изменяет поведение кэширования, и каждый тест пытается создать свой собственный источник данных. Я также должен упомянуть, что я использую AtomikosDataSourceBean, созданный с помощью XADataSourceAutoConfiguration.
Как я могу решить эту проблему, чтобы мой интеграционный тест мог по-прежнему использовать кешированный контекст и одновременно использовать @MockBean
?