当前位置: 首页 > 知识库问答 >
问题:

运行测试控制器时方法setUserService的参数0

宁修永
2023-03-14

我有Spring Security应用程序。我添加了自定义SpringDataUserDetailsService实现UserDetailsService。自动连线setUserService

public class SpringDataUserDetailsService implements UserDetailsService {

    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User user = userService.findByEmail(username);

        if (user == null) {
            throw new UsernameNotFoundException(username);
        }

        return new org.springframework.security.core.userdetails.User(
                user.getEmail(),
                user.getPassword(),
                convertAuthorities(user.getRoles()));
    }

    private Set<GrantedAuthority> convertAuthorities(Set<Role> userRoles) {
        Set<GrantedAuthority> authorities = new HashSet<>();
        for (Role ur : userRoles) {
            authorities.add(new SimpleGrantedAuthority(ur.getRole()));
        }
        return authorities;
    }
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByEmail(String email);
}
@Service
public class UserService {

    private static final String DEFAULT_ROLE = "ROLE_USER";
    private final UserRepository userRepository;
    private final RoleRepository roleRepository;
    private final PasswordEncoder passwordEncoder;

    public UserService(UserRepository userRepository, RoleRepository roleRepository, PasswordEncoder passwordEncoder) {
        this.userRepository = userRepository;
        this.roleRepository = roleRepository;
        this.passwordEncoder = passwordEncoder;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public void registerNewUserAccount(User user) {
        if (emailExist(user.getEmail())) {
            throw new UserAlreadyExistException("There is an account with that email address: "
            + user.getEmail());
        }

        // set default role
        Role userRole = roleRepository.findRoleByRole(DEFAULT_ROLE);
        user.getRoles().add(userRole);

        // set hash password
        user.setPassword(passwordEncoder.encode(user.getPassword()));

        // save
        userRepository.save(user);
    }

    public User findByEmail(String email) {
        return userRepository.findByEmail(email);
    }

    private boolean emailExist(String email) {
        return userRepository.findByEmail(email) != null;
    }
}

我已经通过浏览器测试过了,它工作正常。我可以注册新用户(到数据库),然后登录到应用程序。现在我想为CustomController编写测试,但是收到错误。如果我删除AutowungsetUserService测试通过,但是我不能注册新用户。我需要在哪里找到问题?

在上下文初始化过程中遇到的异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationExctive:创建名为springSecurityFilterChain的bean时出错在类路径资源[org/spring框架/安全/配置/注释/web/配置/WebSecurityConfiguration.class]中定义:通过工厂方法的Bean实例化失败;嵌套异常org.springframework.beans.BeanInstantiationExctive:未能实例化[javax.servlet.过滤器]:工厂方法'springSecurityFilterChain'抛出异常;嵌套异常org.springframework.beans.factory.不满意依赖异常:创建名称为'CustUserDetailsService'的bean时出错:通过方法'setUserService'参数0表示的不满意依赖;嵌套异常org.springframework.beans.factory.NoSuchBean定义异常:没有类型'. service的限定bean。UserService'可用:预计至少有1个bean符合自动配线候选资格。依赖注释:{}

@ExtendWith(SpringExtension.class)
@WebMvcTest(CustomerController.class)
class CustomerControllerTest {

    @MockBean
    private CustomerService customerService;

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }

    @WithMockUser(value = "spring")
    @Test
    void shouldReturnViewWithPrefilledData() throws Exception {

        Customer customer = new Customer();
        customer.setId(1L);
        customer.setCustomerName("customer Name");

        when(customerService.getAllCustomers()).thenReturn(List.of(customer));

        this.mockMvc.perform(MockMvcRequestBuilders.get("/customer/list"))
                .andExpect(status().isOk())
                .andExpect(view().name("customer/customer-list"))
                .andExpect(MockMvcResultMatchers.model().attributeExists("customers"));

    }
}

共有1个答案

微生嘉
2023-03-14

你应该加上

@Import({UserService.class})

去你的测试班。结果就是

@ExtendWith(SpringExtension.class)
@WebMvcTest(CustomerController.class)
@Import({UserService.class})
class CustomerControllerTest {

您已经用“WebMvcTest”注释了您的类。在这种情况下,spring并没有完全启动它的整个上下文。例如,Bean初始化只针对控制器进行。如果您希望初始化所有内容(因为您很懒,或者因为您的UserService有更多依赖项,需要手动导入),您可以替换

@WebMvcTest(CustomerController.class)

@SpringBootTest

然而,这将需要更长的时间来启动unitTest,因为它必须初始化更多的上下文

 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/testing-controllers/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller集成自Ember.Object。 针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。 测试控制器操作 下面给出一个PostsController

  • 经过前面一系列中间件的工作,现在请求终于要达到了正确的控制器方法了。本篇文章主要讲 laravel 如何调用控制器方法,并且为控制器方法依赖注入构建参数的过程。 路由控制器的调用 我们前面已经解析过中间件的搜集与排序、pipeline 的原理,接下来就要进行路由的 run 运行函数: protected function runRouteWithinStack(Route $route, Requ

  • 我试图用JUnit5控制台启动器运行一个简单的测试。我试了几个选择,但都不起作用。谁能告诉我哪里出了问题吗? .+--JUnit Jupiter[OK] '--JUnit Vintage[OK] 测试运行在11毫秒后完成[2个容器] [0个容器跳过][2个容器启动] [0个容器中止][2个容器成功] [0个容器失败][0个测试找到] [0个测试跳过][0个测试启动] [0个测试中止][0个测试成功

  • 问题内容: 我正在尝试使用JUnit5控制台启动器运行一个简单的测试。我尝试了几种选择,但是没有用。有人可以告诉我哪里出了问题吗? 给我警告 我试图在目录中运行所有测试,但这似乎找不到测试: 结果是这样的: 。+-JUnit Jupiter [确定] ‘-JUnit Vintage [确定] 11毫秒后测试运行完成[找到2个容器] [跳过0个容器] [0个容器中止] [2个容器成功] [0个容器失

  • spring-test模块对测试控制器@Controller提供了最原生的支持。详见14.6 "Spring MVC测试框架"一节。

  • 新的Spring靴。 控制器中的API看起来像, 测试用例看起来像, 现在,在运行测试用例(命令1)后,我得到了以下结果 “java.lang.AssertionError:预期状态: 但“命令2”如期成功。 我的问题是, RestController Prefix Path Controller Prefix Path=整个路径。 为了调用API,我们必须遵循上面的格式,但是如果遵循相同的内容,