gpt4 book ai didi

java - Spring Boot 在测试中不 Autowiring 类

转载 作者:行者123 更新时间:2023-12-01 16:44:34 26 4
gpt4 key购买 nike

我有一个具有以下结构的 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;
}

CurrencyJdbcViewTest:

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: Error creating bean with name 'com.mycompany.infrastructure.persistence.CurrenciesJdbcViewTest': Unsatisfied dependency expressed through field 'persistenceHelper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mycompany.infrastructure.persistence.testingutils.JdbcPersistenceHelper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

似乎 spring 没有检测和 Autowiring JdbcPersistenceHelper 类,即使它被放置在我的 spring boot 的应用程序类所在的 com.mycompany.infrastruct 的子包中,所以我认为它应该能够检测到它,而无需任何进一步的配置。我在这里遗漏了什么吗?

最佳答案

您有“src/main/test/com.mycompany/”,但应该是“src/test/java/com/mycompany/”

我猜“test”被视为包名称,因此组件扫描不会拾取它。

如果您想在测试中使用依赖项注入(inject),您可能需要考虑使用构造函数注入(inject)来支持字段注入(inject),因为它被认为是更好的样式并且更清晰(必须设置所有必需的依赖项)。

我想我不会使用 D.I.对于我的测试来说,只是将任何帮助器实例化为字段或在 @Before 方法中。我并不真正将测试视为应用程序组件,而是将其视为独立的事物。根据我的经验,较低的复杂性有助于理解和维护测试。

关于java - Spring Boot 在测试中不 Autowiring 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54744100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com