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

Spring Boot测试-没有合格Bean异常

姚乐家
2023-03-14

在尝试使用Spring Boot framework进行一些测试时,我遇到了一个问题,无法找到测试单元所依赖的Bean。

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authServerApplication': Unsatisfied dependency expressed through field 'passwordEncoder'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.crypto.password.PasswordEncoder' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我的测试类:

    @RunWith(SpringRunner.class)
@DataJpaTest
@SpringBootTest

public class UserDetailsTest {

    @Autowired
    private TestEntityManager entityManager;

//    @MockBean
//    private PasswordEncoder passwordEncoder;

    @Autowired
    private UserRepository userRepo;

    @Test
    public void test() {
        OAuthUser user = null;
        this.entityManager.persist(new OAuthUser("Kelly", "Marchewa", "kmarchewa", "password"));
        user = userRepo.findByUserName("kmarchewa");
        System.out.println(user.getPassword());
        assertThat(user.getUserName()).isEqualTo("kmarchewa");


    }

}
@SpringBootApplication
public class AuthServerApplication {

@Autowired
private PasswordEncoder passwordEncoder;

public static void main(String[] args) {
    SpringApplication.run(AuthServerApplication.class, args);
}

@Bean
public CommandLineRunner demo(UserRepository repository) {
    return(args) -> {
        OAuthUser user = new OAuthUser();


        user.setFirstName("Kelly");
        user.setLastName("Marchewa");
        user.setPassword(passwordEncoder.encode("Admin"));
        user.setUserName("Admin");

    // repository.save(user);
    };
}
}
@Configuration
public class AppConfig {

        @Value("${spring.datasource.url}")
        private String datasourceUrl;

        @Value("${spring.datasource.driverClassName}")
        private String dbDriverClassName;

        @Value("${spring.datasource.username}")
        private String dbUsername;

        @Value("${spring.datasource.password}")
        private String dbPassword;

        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
        /// more code here 
}
    @Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private OAuthUserDetailsService userService;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Bean
    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
}

    // Hash password
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService)
        .passwordEncoder(passwordEncoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http
               .sessionManagement()
               .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
               .and()
               .httpBasic()
               .realmName("test")
               .and()
               .csrf()
               .disable();

    }
}
    public interface UserRepository extends CrudRepository<OAuthUser, Long> {

    public OAuthUser findByUserName(String name);
}

如果我试图在测试类中自动连接bean,我也会收到同样的错误。

@Autowired 
private PasswordEncoder passwordEncoder;

共有1个答案

洪开诚
2023-03-14

问题是@datajpatest这个注释应该只用于数据存储库测试,而不是完全集成(您正在做的工作),因为它只在上下文中创建持久性bean,而不是所有bean(找不到bean的原因)。您需要做是只使用@springboottest并声明h2作为测试依赖项,这样将使用内存数据库创建应用程序的完整重新创建

 类似资料:
  • 关于stackoverflow有很多类似的问题,但我发现没有一个是我的问题。 在Spring Boot2.0.2.Release的集成测试中,我为该测试创建了一个单独的@Configuration类,并在其中定义了bean。这个bean恰好被中的其他一些bean使用。 设置和拆分的通用摘要: src/test中的MyIntegrationTestConfig,用于替代src/main中的配置: b

  • 当试图用包含所有上下文配置的抽象类运行stepdefs时,spring看到2个不同的beans parent和step def 我使用的是Spring Booking版本:2.6.4,JUnit 5和Cucumber版本7.2.3 异常堆栈跟踪: io.cucumber.core.runtime.CucumberExecutionContext.runTestCase:没有可用的“Cucumber

  • 我尝试自动连接我的mapstruct mapper: 这是可行的: 但是为什么我不能使用: 我得到以下错误: 导致原因:org . spring framework . beans . factory . nosuchbeandidefinitionexception:没有类型为“pl . comp . window . application . mapper . windowdtomapper

  • 问题内容: 我正在尝试构建一个全新的Spring Framework 4.0项目,而没有所有神奇的东西,而只是简单地将它踢过去。 我在这里关注该教程:http : //spring.io/guides/tutorials/data/并取得了一些成功。我只是停留在这一点上。 当我运行此单元测试时,得到以下堆栈跟踪: 根据观察和研究,似乎是在告诉我有两个EntityManager类。第一个来自hibe

  • 我使用SpringBoot start构建了一个用于学习的项目 但是当我添加由mybatis生成器生成的orm文件时,它启动失败。 例如: 我已经配置了mybatis locationmapper属性和sqlSessionFactoryBean 这是我的application.properties文件:

  • 我有以下由Spring MVC API提供的具有单endpoint的结构: 接口 控制器 为了测试API,我首先创建了,并且能够成功地执行它: