Могу ли я издеваться над CrudRepository с Spring Data JDB C без какой-либо базы данных, используя Spring Boot? - PullRequest
1 голос
/ 19 февраля 2020

Я занимаюсь разработкой приложения, которое использует Spring Boot 2 и Spring Data JDB C. В конечном приложении будет использоваться MySQL.

. В настоящее время у меня есть уровень персистентности и уровень сервиса, а также несколько репозиториев, полученных из CrudRepository.

Для моих модульных тестов я действительно хочу сделать модульные тесты без какой-либо базы данных. Даже не H SQL. Я знаю, что здесь можно подписаться на несколько разных философий, но я хочу переключиться на чистые модульные тесты и посмотреть, как это закончится. Я буду использовать базу данных в интеграционных тестах.

У меня есть отдельная application.properties в моей папке с тестами, где у меня есть отдельная конфигурация для моих тестов.

По умолчанию Spring Boot имеет значение H SQL если источник данных не определен в application.properties. Но опять же, я хочу запустить свои тесты без какой-либо базы данных и только издеваться над моими реализациями CrudRepository. Я попытался отключить автоконфигурацию базы данных Spring Boot, используя различные варианты следующего в моем application.properties:

spring.autoconfigure.exclude= \
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
  org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
  org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
  org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration

В своих тестах я пытался сделать что-то вроде этого:

@ExtendWith(SpringExtension.class)
@Transactional
@SpringBootTest
public class UserServiceTest {

    private UserService userService;

    @MockBean
    private UserRepository userRepository;

    @BeforeEach
    void setUp() {
        userService = new UserService(userRepository);
    }

    @Test
    public void doSomeTest() {

         // Test code goes here

    }

}

Я использую инжекцию зависимости на основе конструктора в сервисах. Тем не менее, я получаю ошибки от Spring, такие как:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'package.userRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Я хочу создать поддельный репозиторий, в котором я могу предварительно сконфигурировать поддельное хранилище для возврата фиктивных данных. Но похоже, что удаление конфигурации базы данных полностью удаляет CrudRepository, так что никакая часть приложения весенней загрузки не может запуститься. Или я что-то упускаю.

Я использую Eclipse, Maven, Mockito и JUnit5. Я должен отметить, что все работает, если я запускаю «модульные тесты» для тестовой базы данных mysql, поэтому я знаю, что нет ничего действительно плохого в коде, тестах или настройке в целом. Проблемы начинаются только тогда, когда я хочу избавиться от базы данных.

Я - младший Java разработчик, делающий это для развлечения, поэтому я могу упустить что-то очевидное. Поиск в Интернете данных Spring JDB C затруднен, поскольку я почти нахожу только решения, связанные с JPA.

1 Ответ

0 голосов
/ 19 февраля 2020

@SpringBootTest загружает весь ваш контекст. Spring boot - @ SpringBootTest

Под капотом @SpringBootTest пытается имитировать c процессы, добавленные средой Spring Boot для создания контекста, например, он решает, что сканировать на основе в структурах пакетов загружает внешние конфигурации из предопределенных расположений, при необходимости запускает автозапуски автоконфигурации и т. д.

Поскольку мы видим, что эта аннотация запускается и настраивается почти все приложение до начала теста, мы должны использовать @SpringBootTest, чтобы написать интеграционные тесты, использующие процессы и зависимости приложения.

Включая UserService. И я думаю, что он не может найти UserRepository, поэтому он терпит неудачу.

Я думаю, вы должны удалить эти строки

spring.autoconfigure.exclude= \
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
  org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
  org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
  org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration

и проверить, как это

@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
public class UserServiceTest {

    @TestConfiguration
    class UserServiceTestContextConfiguration {

        @Bean
        public UserService userService() {
            return new UserService(userRepository);
        }
    }

    @Autowired
    private UserService userService;

    @MockBean
    private UserRepository userRepository;

    // write test cases here
}

Я взял отсюда

И имейте в виду, что Spring обрабатывает @TestConfiguration специально, поэтому не "стреляйте ногой" с ним Spring boot - @ TestConfiguration

При весенней загрузке любые bean-компоненты, настроенные в классе верхнего уровня с аннотацией @TestConfiguration, не будут обнаружены при сканировании компонента. Мы должны явно зарегистрировать класс @TestConfiguration в классе, который содержит контрольные примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...