У нас есть приложение, основанное на Spring Boot 2.0. Мы находимся в процессе переноса его на JDK11 с JDK8. Это также позволило нам обновить Spring Boot с 2.0 до 2.1. После прочтения журнала изменений выяснилось, что нам нужны какие-то серьезные изменения.
Теперь проблема заключается в том, что некоторые тестовые классы помечены как @SpringBootTest, так и @DataJpaTest. Согласно это, а также документации, мы не должны использовать оба вместе, и вместо этого мы изменили @DataJpaTest на @AutoConfigureTestDatabase. Вот как выглядит код:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {A.class, B.class}, properties = {
"x=xxx",
"y=yyy"
})
@AutoConfigureTestDatabase // Used to be @DataJpaTest
@EnableJpaRepositories("com.test")
@EntityScan("com.test")
public class Test {
@TestConfiguration
public static class TestConfig {
// Some beans returning
}
// Tests
}
Теперь мы получаем следующую ошибку:
NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
Итак, в соответствии с этот ответ мы сделали что-то вроде этого:
@EnableJpaRepositories(basePackages = "com.test", entityManagerFactoryRef = "entityManagerFactory")
Даже после этого мы все еще получаем ту же ошибку. Это правильный способ удалить @DataJpaTest? Или нам нужно удалить @SpringBootTest и сделать что-то еще? Любое руководство очень ценится.
Как вы думаете, почему вам нужно использовать и SpringBootTest, и DataJpaTest?
@AndyWilkinson, мы не используем автоматическую настройку. Я постараюсь сделать пример, но это может занять некоторое время.
Взгляните на этот stackoverflow.com/a/53932997/6643803, у меня была похожая проблема, и я решил ее так.
в нашем проекте мы используем комбинацию @DataJpaTest с @ContextConfiguration(locations = { "classpath:test-context.xml" }). Это связано с тем, что тестовый модуль изолирован от всех других модулей. В test-context.xml мы определили <context:component-scan base-package = "base.packages.whatever" />
@Devilluminati, да, я переключился на комбинацию @ContextConfiguration и @TestPropertySource, чтобы запустить его. Кто-то поправьте меня, если это неправильный способ исправить это.
@Devilluminati, если вы можете опубликовать это как ответ, буду рад принять его и закрыть вопрос.




Тестовый класс снабжен аннотациями @DataJpaTest и @ContextConfiguration.
@RunWith(SpringRunner.class)
@DataJpaTest
@ContextConfiguration(locations = { "classpath:test-context.xml" })
public abstract class AbstractTestCase {
protected static final Logger LOG = LoggerFactory.getLogger(AbstractTestCase.class);
}
Мы определили test-context.xml. Это связано с тем, что тестовый модуль изолирован от всех других модулей (проект с несколькими модулями maven). В test-context.xml мы определили компонентное сканирование для базового пакета.
<context:component-scan base-package = "de.example.base.package" />
Предполагая, что ваше приложение использует автоматическую настройку,
@SpringBootTestдолжен быть надмножеством@DataJpaTest. Если нет фабрики диспетчера сущностей, может показаться, что автоконфигурация JPA не активна. Я не могу сказать почему из того, что вы поделились до сих пор. Можете ли вы обновить свой вопрос с помощью минимальный, полный и проверяемый пример?