1

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

@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 定义,所以我假设测试上下文在这里是可见的。但我不明白为什么它不接线。

另一方面,我可以在测试类中创建这些字段,自动装配它们并将其设置为创建的对象。有人能说出为什么这些字段为空吗?

4

2 回答 2

3

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

MyClass obj = new MyClass();

这几乎从不工作1。您需要要求 Spring 容器提供完全可操作的、已初始化的MyClassbean 实例,例如在您的测试用例中使用自动装配/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,但您不想走那条路。

于 2013-01-08T21:19:42.297 回答
1

MyClass春豆吗?如果是这种情况,您不应该自己创建它的实例(通过使用new),而是@Autowired像任何其他依赖项一样拥有它,例如

class MyIntegTest extends IntegTestBase{

   @Autowired
   MyClass obj;

   @Test
   public testingMethod(){
      obj.methodToBeTested();
      // ...
   }
}
于 2013-01-08T21:19:46.953 回答