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