Рекомендуемый способ удаления @DataJpaTest при использовании вместе с @SpringBootTest

У нас есть приложение, основанное на 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. Если нет фабрики диспетчера сущностей, может показаться, что автоконфигурация JPA не активна. Я не могу сказать почему из того, что вы поделились до сих пор. Можете ли вы обновить свой вопрос с помощью минимальный, полный и проверяемый пример?

Andy Wilkinson 05.06.2019 13:52

Как вы думаете, почему вам нужно использовать и SpringBootTest, и DataJpaTest?

Simon Martinelli 05.06.2019 14:03

@AndyWilkinson, мы не используем автоматическую настройку. Я постараюсь сделать пример, но это может занять некоторое время.

Killer Beast 05.06.2019 14:06

Взгляните на этот stackoverflow.com/a/53932997/6643803, у меня была похожая проблема, и я решил ее так.

akuma8 05.06.2019 14:22

в нашем проекте мы используем комбинацию @DataJpaTest с @ContextConfiguration(locations = { "classpath:test-context.xml" }). Это связано с тем, что тестовый модуль изолирован от всех других модулей. В test-context.xml мы определили <context:component-scan base-package = "base.packages.whatever" />

Devilluminati 05.06.2019 14:41

@Devilluminati, да, я переключился на комбинацию @ContextConfiguration и @TestPropertySource, чтобы запустить его. Кто-то поправьте меня, если это неправильный способ исправить это.

Killer Beast 06.06.2019 10:02

@Devilluminati, если вы можете опубликовать это как ответ, буду рад принять его и закрыть вопрос.

Killer Beast 11.06.2019 13:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
7
626
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тестовый класс снабжен аннотациями @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" />

Другие вопросы по теме