未在 Junits 中注入的嵌套自动装配依赖项
Nested Autowired Dependencies not injected in Junits
下面是演示问题的代码。 Class3 具有自动装配字段 Class2,Class2 具有 Class1 的自动装配依赖项,使用 Class3 获取 Class1 的 String 值的 simpleTest。所以在测试执行中Class2不为null并被注入到Class3中,但是Class1在Class2中为null。
@Component
class Class1{
private String str= "Some String";
//getter setter
}
@Component
class Class2{
@Autowired
Class1 class1;
//getter setter
}
@Component
class Class3{
@Autowired
Class2 class2;
//getter setter
}
public class TestClass{
@InjectMocks
Class3 class3;
@Spy
Class2 class2;
@Spy
Class1 class2;
@Test
public void simpleTest(){
String s = class3.class2.class1.getStr();
Assert.equals(s,"Some String");
}
}
这是因为您在 Class2 上添加了 @Spy
注释,它使 Class2 成为模拟对象而不是有效的 Spring bean。
如果你想在此处获取 Spring 的 DI,你必须使用 @Autowired
获取你的 bean,也许还需要放置
@RunWith(SpringRunner.class)
@SpringBootTest
检查您的测试,使其使用实际上下文。
以下解决了问题。
@InjectMocks
@Spy
Class2 class2;
下面是演示问题的代码。 Class3 具有自动装配字段 Class2,Class2 具有 Class1 的自动装配依赖项,使用 Class3 获取 Class1 的 String 值的 simpleTest。所以在测试执行中Class2不为null并被注入到Class3中,但是Class1在Class2中为null。
@Component
class Class1{
private String str= "Some String";
//getter setter
}
@Component
class Class2{
@Autowired
Class1 class1;
//getter setter
}
@Component
class Class3{
@Autowired
Class2 class2;
//getter setter
}
public class TestClass{
@InjectMocks
Class3 class3;
@Spy
Class2 class2;
@Spy
Class1 class2;
@Test
public void simpleTest(){
String s = class3.class2.class1.getStr();
Assert.equals(s,"Some String");
}
}
这是因为您在 Class2 上添加了 @Spy
注释,它使 Class2 成为模拟对象而不是有效的 Spring bean。
如果你想在此处获取 Spring 的 DI,你必须使用 @Autowired
获取你的 bean,也许还需要放置
@RunWith(SpringRunner.class)
@SpringBootTest
检查您的测试,使其使用实际上下文。
以下解决了问题。
@InjectMocks
@Spy
Class2 class2;