模拟自动装配的bean会引发NullPointerException

时间:2018-10-03 07:21:43

标签: java spring mockito

我在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时没有任何影响。

1 个答案:

答案 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,因此它们将作为对控制器的依赖项注入。