Spring Testcontext框架中的自动装配

时间:2013-01-08 21:11:35

标签: spring integration-testing autowired applicationcontext test-framework

我有一个集成测试,它执行以下操作:

@ContextConfiguration( locations={..path to xmls..} )
class IntegTestBase{

   --- some field initializations; ---
}

class MyIntegTest extends IntegTestBase{

   @Test
   public testingMethod(){
      MyClass obj = new MyClass();
      obj.methodToBeTested();

      ---- some assertions ----
   }
}

class MyClass{

   @Autowired
   Something obj1;

   public int methodToBeTested(){

      --- Somecode ---
   }
}

在上面的代码中,我想,当测试用例运行MyClass对象时,创建的所有字段都将自动装配。但是,当测试运行时,所有自动装配的字段都为空。它没有抱怨无法找到bean定义,所以我假设测试上下文在这里可见。但我不明白为什么它不接线。

另一方面,我能够在testclass中创建这些字段,使其自动装配并将其设置为创建的对象。有人能说出为什么这些字段是空的吗?

2 个答案:

答案 0 :(得分:3)

您正在使用new运算符创建Spring bean:

MyClass obj = new MyClass();

这几乎从不起作用 1 。您需要让Spring容器提供MyClass bean的完全可操作的初始化实例,例如:在测试用例中使用自动装配/ DI:

@ContextConfiguration( locations={..path to xmls..} )
class IntegTestBase{

  @Autowired
  protected MyClass obj;

}

稍后在您的测试中使用它:

@Test
public testingMethod(){
  //don't recreate `obj` here!
  obj.methodToBeTested();

  ---- some assertions ----
}

实际上,这是Spring Test Support提供的功能。您还必须记住,如果obj是单身,MyClass将指向每个测试中的完全相同的实例,但这通常不是问题。

1 理论上可以使用完整的AspectJ,但你不想走那条路。

答案 1 :(得分:1)

MyClass是一个Spring bean吗?如果是这种情况,您应该自己创建一个实例(通过使用new),但让它@Autowired就像任何其他依赖项一样,例如

class MyIntegTest extends IntegTestBase{

   @Autowired
   MyClass obj;

   @Test
   public testingMethod(){
      obj.methodToBeTested();
      // ...
   }
}