我有一个集成测试,它执行以下操作:
@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中创建这些字段,使其自动装配并将其设置为创建的对象。有人能说出为什么这些字段是空的吗?
答案 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();
// ...
}
}