如何解决Junit 测试没有自动连接我的服务类但它在控制器中工作
我不知道为什么会这样,服务的 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 测试中不起作用.... 总是发现不合格的 bean 问题。
有什么建议吗?
解决方法
DataJpaTest
是一个切片测试,它不会加载整个 Spring 应用程序上下文,即它不会加载您的服务,而只会加载测试 JPA 功能所需的内容。
如果要将 UserService
作为 bean 加载,则需要导入。
然而,鉴于所有在您的 UserService
中也自动装配的依赖项,您可能最好只使用 SpringBootTest
加载整个上下文。
如果加载整个上下文花费的时间太长,您可以排除自动配置/配置,过滤组件扫描,如果您使用组件扫描而不是配置。
有关 DataJpaTest
您可以使用@DataJpaTest 注解来测试 JPA 应用程序。默认情况下,它会扫描 @Entity 类并配置 Spring Data JPA 存储库。如果在类路径上有一个嵌入式数据库可用,它也会配置一个。默认情况下,通过将 spring.jpa.show-sql 属性设置为 true 来记录 SQL 查询。这可以使用注释的 showSql() 属性禁用。
使用@DataJpaTest 注释时不会扫描常规@Component 和@ConfigurationProperties bean。 @EnableConfigurationProperties 可用于包含@ConfigurationProperties bean。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。