微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Junit 测试没有自动连接我的服务类但它在控制器中工作

如何解决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

的信息

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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?