Тест Junit не подключил мой класс обслуживания автоматически. Но это работает в контроллере

#spring #autowired

Вопрос:

Я не знаю, почему это происходит, автоматическая проводка службы работает в контроллере, но не работает в тестовом классе Junit

Вот мой тест JUnit:

 package com.crmbackend.user;
import static org.assertj.core.api.Assertions.assertThat; 
import org.junit.jupiter.api.Test;
import com.crmbackend.entity.Role;
import com.crmbackend.entity.User;
import com.crmbackend.userService.UserService;
@DataJpaTest(showSql = true)
@AutoConfigureTestDatabase(replace = Replace.NONE)
@Rollback(false)

public class UserServiceTests {

    @Autowired
    private TestEntityManager entityManager;
    @Autowired
    private UserService service;

    @Test
    public void testCreateNewUserWithSingleRolePasswordEncode() {
        Role roleUser = entityManager.find(Role.class, 3);
        User userLucas = new User("lucas9324", "Lucas", "Tom", "qqq542417349", "Lucas9324@outlook.com", "7364832234");
        userLucas.addRole(roleUser);

        User savedUser = service.save(userLucas);
        assertThat(savedUser.getId()).isGreaterThan(0);
    }

}
 

Вот мой класс обслуживания:

 package com.crmbackend.userService;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import com.crmbackend.entity.User;

@Service
@Transactional
public class UserService {

    @Autowired
    private UserRepository userRepo;

    @Autowired
    private RoleRepository roleRepo;

    @Autowired
    private PasswordEncoder passwordEncoder;

    public User getByUsername(String username) {
        return userRepo.getUserByUsername(username);
    }

    private void encodePassword(User user) {
        String encodedPassword = passwordEncoder.encode(user.getPassword());
        user.setPassword(encodedPassword);
    }


    public User save(User user) {
        boolean isUpdatingUser = (user.getId() != null);
        if (isUpdatingUser) {
            User existingUser = userRepo.findById(user.getId()).get();

            if (user.getPassword().isEmpty()) {
                user.setPassword(existingUser.getPassword());
            } else {
                encodePassword(user);
            }

        } else {
            encodePassword(user);
        }
        return userRepo.save(user);

    }

    
}
 

@Autowired из

  @Autowired
    private UserService service;
 

Отлично работает в контроллере, но не работает в тесте JUnit….
Всегда получал не квалифицирующуюся проблему с найденными бобами.

Есть какие-нибудь предложения?

Ответ №1:

DataJpaTest это тест среза, он не загружает весь контекст приложения Spring, т. Е. Он не загружает ваш сервис, а только то, что требуется для тестирования функциональности JPA.

Если вы хотите загрузить свой UserService файл в качестве компонента, вам нужно будет импортировать его.

Однако, учитывая все зависимости, которые также автоматически подключены в вашем UserService , вам, вероятно, лучше просто использовать SpringBootTest для загрузки всего контекста.

Вы можете исключить автоконфигурации/конфигурации, фильтровать сканирование компонентов, если вы используете сканирование компонентов по конфигурациям, если загрузка всего контекста занимает слишком много времени.

Для получения информации о DataJpaTest

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications.autoconfigured-spring-data-jpa

Вы можете использовать аннотацию @DataJpaTest для тестирования приложений JPA. По умолчанию он сканирует классы @Entity и настраивает репозитории JPA Spring Data. Если встроенная база данных доступна в пути к классам, она также настраивает ее. SQL-запросы регистрируются по умолчанию, задав свойству spring.jpa.show-sql значение true. Это можно отключить с помощью атрибута showSql() аннотации.

Обычные компоненты @Component и @ConfigurationProperties не сканируются при использовании аннотации @DataJpaTest. @EnableConfigurationProperties можно использовать для включения компонентов @ConfigurationProperties.