我要做的事情,:运行一个JUnit测试(一个JUnit测试类和一个测试方法)。测试类有一个依赖项,我希望Spring在运行测试之前处理它(inject)。
我看到的:测试类被实例化两次,其中一个实例满足(注入)依赖,而另一个实例不满足。测试是使用依赖项为而不是注入的实例运行的。
我的猜测是:我推测这个测试类被实例化了两次,因为Spring使用第一个实例来分析依赖项(可能是使用反射来查找注释,而我没有使用)。
但是:我不知道为什么没有为其创建/注入依赖项的测试类实例用于运行测试。
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依赖注入为空,但我无法从这个答案中分辨出发生了什么。
抱歉,新手的问题--我已经翻阅了几天的文档(和困扰同事),对此感到困惑。
谢谢!
发布于 2014-03-14 23:16:19
加:@Autowired
@Autowired
private IPrimaryDependency mDep;解释:
JUnit为每个测试创建全新的测试类实例。Spring JUnit runner只通过“准备”创建的对象来扩展这种行为,这基本上意味着建立应用程序上下文和注入注释驱动的依赖关系。
在您的示例中,测试类被实例化了两次:从test.xml (属性在那里注入)和由JUnit运行程序运行第一个测试方法。但是,当由JUnit创建时,Spring不知道它需要注入什么,因为类中没有注释,因此属性最终为null。
有关实现细节,请参阅SpringJUnit4ClassRunner和DependencyInjectionTestExecutionListener的源代码。
发布于 2014-03-14 23:18:26
你的测试课是
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test.xml"})
public class MyTestClass {您可以使用JUnit运行这个类。由于@RunWith,JUnit使用SpringJUnit4ClassRunner实例实例化类并运行其测试。
由于@ContextConfiguration,ClassRunner将通过加载test.xml文件生成ApplicationContext。
该test.xml文件具有测试类的<bean>定义。
<bean id="test" class="com.example.MyTestClass">
<property name="primaryDependency" ref="pridep"/>
</bean>因此Spring还将生成一个实例并设置适当的属性。
基本上,我要了解的是,您的测试类不应该是Spring上下文中的bean。创建一个不同的测试类,并将具有注入目标的bean注入到您的测试类中。
https://stackoverflow.com/questions/22417419
复制相似问题