首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring & JUnit: Spring实例化两个测试类实例,只为一个实例注入依赖项,运行另一个实例

问Spring & JUnit: Spring实例化两个测试类实例,只为一个实例注入依赖项,运行另一个实例
EN

Stack Overflow用户
提问于 2014-03-14 23:12:39
回答 2查看 1.7K关注 0票数 0

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

我看到的:测试类被实例化两次,其中一个实例满足(注入)依赖,而另一个实例不满足。测试是使用依赖项为而不是注入的实例运行的。

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

但是:我不知道为什么没有为其创建/注入依赖项的测试类实例用于运行测试。

test.xml

代码语言:javascript
复制
<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

代码语言:javascript
复制
@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

代码语言:javascript
复制
public class MyPrimaryDependency extends RequiresADataSource implements IPrimaryDependency {

  public MyPrimaryDependency() {
  }
}

现有的相关问题:运行测试用例时,Spring依赖注入为空,但我无法从这个答案中分辨出发生了什么。

抱歉,新手的问题--我已经翻阅了几天的文档(和困扰同事),对此感到困惑。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-03-14 23:16:19

加:@Autowired

代码语言:javascript
复制
@Autowired
private IPrimaryDependency mDep;

解释:

JUnit为每个测试创建全新的测试类实例。Spring JUnit runner只通过“准备”创建的对象来扩展这种行为,这基本上意味着建立应用程序上下文和注入注释驱动的依赖关系。

在您的示例中,测试类被实例化了两次:从test.xml (属性在那里注入)和由JUnit运行程序运行第一个测试方法。但是,当由JUnit创建时,Spring不知道它需要注入什么,因为类中没有注释,因此属性最终为null。

有关实现细节,请参阅SpringJUnit4ClassRunner和DependencyInjectionTestExecutionListener的源代码。

票数 2
EN

Stack Overflow用户

发布于 2014-03-14 23:18:26

你的测试课是

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test.xml"})
public class MyTestClass {

您可以使用JUnit运行这个类。由于@RunWith,JUnit使用SpringJUnit4ClassRunner实例实例化类并运行其测试。

由于@ContextConfiguration,ClassRunner将通过加载test.xml文件生成ApplicationContext。

该test.xml文件具有测试类的<bean>定义。

代码语言:javascript
复制
<bean id="test" class="com.example.MyTestClass">
    <property name="primaryDependency" ref="pridep"/>
</bean>

因此Spring还将生成一个实例并设置适当的属性。

基本上,我要了解的是,您的测试类不应该是Spring上下文中的bean。创建一个不同的测试类,并将具有注入目标的bean注入到您的测试类中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22417419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档