Spring Boot无法自动装配测试类

时间:2019-02-18 09:30:41

标签: java spring spring-boot

我有一个具有以下结构的Spring Boot 2应用程序:

- src/main/java/com.mycompany/
---- application
---- domain
---- infrastructure
-------- persistence
------------ ...
-------- Application.java
- src/main/test/java/com.mycompany/
---- application
---- domain
---- infrastructure
-------- persistence
------------ testingutils
---------------- JdbcPersistenceHelper.java
------------ CurrenciesJdbcViewTest.java

应用程序类:

package com.mycompany.infrastructure;

@SpringBootApplication
public class Application {

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

JdbcPersistenceHelper:

package com.mycompany.infrastructure.persistence.testingutils;

@Component
public class JdbcPersistenceHelper {

    private EntityManager entityManager;

    @Autowired
    public JdbcPersistenceHelper(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

货币JdbcViewTest:

package com.mycompany.infrastructure.persistence;

@DataJpaTest
public class CurrenciesJdbcViewTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private JdbcPersistenceHelper persistenceHelper;

    private CurrenciesJdbcView view;

    @BeforeEach
    void setUp() {
        view = new CurrenciesJdbcView(jdbcTemplate);
    }

但是,当我运行测试时,在ApplicationContext加载时出现如下错误:

  

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为'com.mycompany.infrastructure.persistence.CurrenciesJdbcViewTest'的bean时出错:通过字段'persistenceHelper'表示的不满足的依赖关系;嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为'com.mycompany.infrastructure.persistence.testingutils.JdbcPersistenceHelper'的合格Bean:期望至少有1个有资格作为自动装配候选的Bean。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

即使Spring放置在我的Spring Boot应用程序类所在的JdbcPersistenceHelper子包中,它似乎也无法检测和自动装配com.mycompany.infrastructure类,因此我认为它应该能够检测到它没有任何进一步的配置。 我在这里想念东西吗?

2 个答案:

答案 0 :(得分:3)

您具有“ src / main / test / com.mycompany /”,但应为“ src / test / java / com / mycompany /”

我猜“测试”被视为软件包的名称,因此没有被组件扫描获取。

如果要在测试中使用依赖项注入,则可能希望考虑使用构造函数注入,而不是字段注入,因为它被认为是更好的样式和更清晰的(必须设置所有必需的依赖项)。

我认为我不会使用D.I.完全适合我的测试,但是只需将任何帮助程序实例化为字段或@Before方法即可。我并不是真正将测试视为应用程序组件,而是将其视为独立的东西。降低复杂性有助于理解和维护测试经验。

答案 1 :(得分:2)

您仅在测试课程上使用@DataJpaTest;最有可能的是,您的“帮助程序”(我建议用Spring Data JPA代替)不在该切片中,需要使用includeFilters@ContextConfiguration添加到该切片中。