使用 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
,它会混淆。
我是 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
,它会混淆。