gpt4 book ai didi

java - Spring & JUnit : Spring instantiates two instances of test class, 仅注入(inject)其中一个的依赖项,运行另一个

转载 作者:行者123 更新时间:2023-12-01 23:08:25 25 4
gpt4 key购买 nike

我想做的事情:运行单个 JUnit 测试(一个 JUnit 测试类和一个测试方法)。测试类有一个依赖项,我希望 Spring 在运行测试之前处理(注入(inject))该依赖项。

我所看到的:测试类被实例化两次,其中一个实例的依赖关系得到满足(注入(inject)),但另一个实例则不然。使用注入(inject)依赖项的实例运行测试。

我的猜测:我推测测试类被实例化两次,因为 Spring 使用第一个实例来分析依赖关系(可能使用反射来查找注释,我没有使用它) 。

但是:我一生都无法弄清楚为什么使用未创建/注入(inject)依赖项的测试类实例来运行测试。

test.xml

<beans ...>
<bean id="test" class="com.example.MyTestClass">
<property name="primaryDependency" ref="pridep"/>
</bean>

<bean id="pridep" class="com.example.MyPrimaryDependency">
<property name="dataSource" ref="ds"/>
</bean>

<bean id="ds" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"/>
</beans>

MyTestClass.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test.xml"})
public class MyTestClass {

private IPrimaryDependency mDep = null;

public MyTestClass() {
}

public void setPrimaryDependency(IPrimaryDependency dep) {
mDep = dep;
}

@Before
public void createImageData() {
}

@Test
public void testImageSearch() {
assertNotNull("mDep is null", mDep);
}
}

MyPrimaryDependency.java

public class MyPrimaryDependency extends RequiresADataSource implements IPrimaryDependency {

public MyPrimaryDependency() {
}
}

现有相关问题:Spring dependency injection null when running a test case ,但我无法从这个答案中看出发生了什么。

抱歉这个菜鸟问题——我已经搜索文档(并打扰同事)好几天了,对此感到困惑。

谢谢!

最佳答案

添加@Autowired

@Autowired
private IPrimaryDependency mDep;

说明:

JUnit 为每个测试创建全新的测试类实例。Spring JUnit 运行程序仅通过“准备”创建的对象来扩展此行为,这基本上意味着设置应用程序上下文并注入(inject)注释驱动的依赖项。

在您的情况下,测试类被实例化两次:从 test.xml (属性注入(inject)其中)并由 JUnit 运行程序实例化以运行第一个测试方法。然而,当由 JUnit 创建时,Spring 不知道它需要注入(inject)一些东西,因为类中没有注释,因此属性最终为 null。

查看SpringJUnit4ClassRunner的源代码和 DependencyInjectionTestExecutionListener了解实现细节。

关于java - Spring & JUnit : Spring instantiates two instances of test class, 仅注入(inject)其中一个的依赖项,运行另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417419/

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