【问题标题】:The Junit Test not autowired my service class. But it works in the controllerJunit 测试没有自动连接我的服务类。但它在控制器中工作
【发布时间】:2021-07-14 15:37:28
【问题描述】:

我不知道为什么会这样,服务的 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 发现问题。

有什么建议吗?

【问题讨论】:

    标签: spring autowired


    【解决方案1】:

    DataJpaTest 是一个切片测试,它不会加载整个 Spring 应用程序上下文,即它不会加载您的服务,而只会加载测试 JPA 功能所需的内容。

    如果您想将 UserService 作为 bean 加载,则需要导入。

    但是,考虑到在 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 类并配置 Spring Data JPA 存储库。如果类路径上有一个嵌入式数据库,它也会配置一个。默认情况下,通过将 spring.jpa.show-sql 属性设置为 true 来记录 SQL 查询。这可以使用注释的 showSql() 属性来禁用。

    当使用@DataJpaTest 注解时,不会扫描常规的@Component 和@ConfigurationProperties bean。 @EnableConfigurationProperties 可用于包含 @ConfigurationProperties bean。

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多