Below is the code to demonstrate the issue. Class3 has autowired field Class2 and Class2 has autowired dependency of Class1, simpleTest to get the String value of Class1 using Class3. So in the test execution Class2 is not null and gets injected into Class3, but Class1 is null in Class2.
JavaScript
x
@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");
}
}
Advertisement
Answer
That’s because of the @Spy
annotation you put over the Class2, it makes the Class2 a mock and not a valid Spring bean.
If you want to get Spring’s DI here, you’d have to get your beans with the @Autowired
and maybe place
JavaScript
@RunWith(SpringRunner.class)
@SpringBootTest
over your test to make it use the actual context.