我在Spring中具有以下类结构。
BaseClass ,
public abstract class BaseClass {
@Autowired
protected ServiceA serviceA;
public final void handleMessage() {
String str = serviceA.getCurrentUser();
}
}
MyController ,
@Component
public class MyController extends BaseClass {
// Some implementation
// Main thing is ServiceA is injected here
}
到目前为止,它工作正常,我可以看到ServiceA
也已正确注入。
问题在于在下面的测试中模拟ServiceA
时。
MyControllerTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@SpringBootTest
public class MyControllerTest {
@MockBean
private ServiceA serviceA;
@MockBean
private MyController myController;
@Before
public void init() {
when(serviceA.getCurrentUser()).thenReturn(some object);
}
@Test
public void firstTest() {
myController.handleMessage(); // ---> Throws NPE stating that serviceA is null
}
}
如所示,它将引发NullPointerException
。
我不完全理解为什么when.thenReturn
在模拟bean时没有任何影响。
答案 0 :(得分:1)
由于使用的是Spring控制器,因此需要通过@Autowired注释从SpringContext导入控制器:
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@SpringBootTest
public class MyControllerTest {
@MockBean
private ServiceA serviceA;
@Autowired // import through Spring
private MyController myController;
@Before
public void init() {
when(serviceA.getCurrentUser()).thenReturn(some object);
}
@Test
public void firstTest() {
myController.handleMessage(); // ---> Throws NPE stating that serviceA is null
}
}
@MockBean已添加到SpringContext,因此它们将作为对控制器的依赖项注入。