使用 RestTemplate 时出现 NullPointerException Mock

NullPointerException Mock when use RestTemplate

我是 mockito 的新手,我遇到了问题。我写了一个 controller 测试,它使用 restTemplate 从另一个 api 获取数据,但是当我运行test时,这个类型的变量是null。结果 NullPointerException.

可能是什么问题?

控制:

 @GetMapping(value = "api/cstat", produces = "application/json")
    public ResponseEntity<List<String>> cstat() {
               ResponseEntity<DTO> response =                  // <=====NPE
                            restTemplate.exchange(uri, HttpMethod.GET, entity, DTO.class);    

                    if (response.getBody() != null).     //<==== AND HERE NPE(on future))
                    {
                       ...
                    } else {
                        ...
                    }
}

测试:

   
            Dto expected = new Dto();

            String actual = mockMvc.perform(MockMvcRequestBuilders
                                .get("/api/cstat").with(roleLmsRead()))
                        .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();

这是因为您没有restTemplate,所以restTemplate为空。

要初始化这个,在测试中:

  • 您需要声明restTemplate。例如
@Mock
private RestTemplate restTemplate;
  • 然后你需要将它注入你的mockMvc。例如
@Inject
private Mvc mockMvc;

如果您不使用这样的注释样式编写测试。你可以这样做:

@Before
public void setUp() {
    restTemplate = Mockito.mock(RestTemplate.class);
    mockMvc = new MockMvc(restTemplate);
}

P/S:如果mockMvc是你要测试的那个,那么不要把它命名为前缀mock,它会混淆。