有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring应用程序运行,但无法在测试时创建bean

我正在用Spring编写一个应用程序,我想使用单元测试。 当我运行应用程序时,不会发生错误或异常。但当我想进行“梯度测试”时,到处都有不满意的例外情况

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(AuthenticationController.class)
@ContextConfiguration(classes = {MockMvc.class, TokenHandler.class, LoginService.class, UserService.class})
public class AuthenticationControllerTest {

    @Autowired private MockMvc mockMvc;
    @Autowired private TokenHandler tokenHandler;
    @Autowired private LoginService loginService;
    @Autowired private UserService userService;

    @Value("${server.port}") private Integer serverPort;

    private String username;
    private String email;
    private String password;

    private UserEntity userEntity;
    private String token;

    @Before
    public void setUp(){
        this.username = UUID.randomUUID().toString();
        this.email = this.username + "@test.com";
        this.password = UUID.randomUUID().toString();
    }

    @Test
    public void a0_register() throws Exception {
        RegisterDTO registerDTO = new RegisterDTO();
        registerDTO.setUsername(this.username);
        registerDTO.setEmail(this.email);
        registerDTO.setPassword(this.password);

        this.mockMvc.perform(
                MockMvcRequestBuilders.post(URI.create("/authentication/register"))
                    .content(JSON.asJsonString(registerDTO))
                    .contentType(MediaType.APPLICATION_JSON_UTF8))
        .andExpect(status().isOk())
        .andExpect(content().string("0"));

        this.userEntity = this.userService.findAll().stream().filter(e->e.getEmail().equals(email)).findFirst().orElse(null);

        assertNotNull(userEntity);
    }
}

下面是引发的一个异常的示例:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginService': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'net.roomono.administration.Database.Repository.Log.LoginRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:729)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1270)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:721)
... 67 more

共 (1) 个答案

  1. # 1 楼答案

    这条线需要修正:

    @ContextConfiguration(classes = {MockMvc.class, TokenHandler.class, LoginService.class, UserService.class})
    

    不要在这里列出服务或bean类。相反,创建一个配置类来配置bean。例如:

    @Configuration
    public class AppConfig {
      @Bean
      public LoginService loginService() {
        return new LoginService();
      }
      ...
    }
    

    然后,使用它:

    @ContextConfiguration(classes = {AppConfig.class})