我有一个具有以下结构的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
类,因此我认为它应该能够检测到它没有任何进一步的配置。
我在这里想念东西吗?
答案 0 :(得分:3)
您具有“ src / main / test / com.mycompany /”,但应为“ src / test / java / com / mycompany /”
我猜“测试”被视为软件包的名称,因此没有被组件扫描获取。
如果要在测试中使用依赖项注入,则可能希望考虑使用构造函数注入,而不是字段注入,因为它被认为是更好的样式和更清晰的(必须设置所有必需的依赖项)。
我认为我不会使用D.I.完全适合我的测试,但是只需将任何帮助程序实例化为字段或@Before方法即可。我并不是真正将测试视为应用程序组件,而是将其视为独立的东西。降低复杂性有助于理解和维护测试经验。
答案 1 :(得分:2)
您仅在测试课程上使用@DataJpaTest
;最有可能的是,您的“帮助程序”(我建议用Spring Data JPA代替)不在该切片中,需要使用includeFilters
或@ContextConfiguration
添加到该切片中。