【问题标题】:Expected at least 1 bean which qualifies as autowire candidate in Test预计至少有 1 个 bean 有资格作为测试中的自动装配候选者
【发布时间】:2021-10-12 02:00:42
【问题描述】:

我是春天的新人。我正在使用 Spring Boot 创建一个控制台应用程序。该应用程序运行良好,但是当我尝试测试存储库时,出现错误

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'universityManagerSpringBootApplication': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.universitymanager.springboot.engine.ResponseGenerator' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

请帮忙

响应生成器

@Component
@AllArgsConstructor
public class ResponseGenerator {

    private final DepartmentsRepository departmentsRepository;
    private final LectorsRepository lectorsRepository;
...

部门

@Entity
@NoArgsConstructor
@Setter
@Getter
@ToString
@Table(name = "departments")
public class Departments {
...

讲师

@Entity
@NoArgsConstructor
@Setter
@Getter
@ToString
@Table(name = "lectors")
public class Lectors {
...

DepartmentsRepository

@Repository
public interface DepartmentsRepository extends CrudRepository<Departments, Integer> {
...

LectorsRepository

@Repository
public interface LectorsRepository extends CrudRepository<Lectors, Integer> {
...

UniversityManagerSpringBootApplication

@SpringBootApplication
@AllArgsConstructor
public class UniversityManagerSpringBootApplication implements CommandLineRunner {

    private ResponseGenerator responseGenerator;

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

    @Override
    public void run(String... args) throws Exception {
...

DepartmentsRepositoryTest(导致错误)

@DataJpaTest
class DepartmentsRepositoryTest {

    @Autowired
    private DepartmentsRepository departmentsRepository;

    @Test
    void injectedComponentIsNotNull(){
        assertNotNull(departmentsRepository);
    }
...

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa junit5


    【解决方案1】:

    请尝试在您的测试中将 @DataJpaTest 更改为 @SpringBootTest 以使 Spring 在完整的应用程序上下文中设置,包括 ResponseGenerator bean。

    @DataJpaTest 的文档说:

    使用此注解将禁用完全自动配置,而是仅应用与 JPA 测试相关的配置。

    因此,使用此注释,您不会获得堆栈跟踪所引用的 ResponseGenerator bean。

    【讨论】:

    • 他不应该需要它。问题是 @SpringBootApplication 实现了 CommandLineRunner 并依赖于那个 bean。该 bean 不能用于仅 JPA 的测试。基本上,使用这种设置,使用专门的切片测试的能力将不再起作用。因此,更好的建议是更改应用程序的设置,而不是引导他进行全面的集成测试。
    • @Kaj Hejer 带有注释@SpringBootTest 测试挂起并且无法完成
    • @M. Deinum 是的,你是对的。如果没有CommandLineRunner 实现,测试可以正常工作,但程序无法执行其功能。你会建议我改变什么以使程序在控制台模式下运行并且测试工作?
    • 使它成为一个单独的类,将被检测和运行。运行测试时将禁用此检测。它也可以作为 @Bean 方法工作并作为 lamda 实现(但我不是 100% 确定)。
    【解决方案2】:

    我找到了解决问题的方法!这对我来说很好 https://stackoverflow.com/a/29774201/15349979

    很高兴这对某人有帮助

    【讨论】:

      【解决方案3】:

      如果您使用的是 TestNG,请尝试让您的测试类扩展 AbstractTestNGSpringContextTests,这有助于访问 TestNG 中的 spring 组件。

      public class DepartmentsRepositoryTest extends AbstractTestNGSpringContextTests
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-30
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 2021-01-13
        • 1970-01-01
        相关资源
        最近更新 更多