【发布时间】:2019-02-03 20:40:36
【问题描述】:
我想测试一个Tasklet 实现,它使用@Autowired RestTemplateBuilder 来构建RestTemplate。 RestTemplate 执行请求。我想模拟这个请求的响应。
@ContextConfiguration(classes = DogTasklet.class )
@RunWith(SpringRunner.class)
public class DogTaskletTest {
@MockBean
RestTemplateBuilder restTemplateBuilder;
private RestTemplate restTemplate = new RestTemplate();
@Autowired
private Tasklet sut;
@Before
public void setUp() throws Exception {
given(this.restTemplateBuilder.build()).willReturn(restTemplate);
}
}
given() 语句引发 NPE,因为 RestTemplateBuilder 实例是 null。我错过了什么?
更新:我将测试更改为以下解决 NPE 的测试,现在我在 sut.execute() 期间有 null ResponseEntity。
@RunWith(SpringRunner.class)
public class DogTaskletTest {
@TestConfiguration
static class TestConfig {
@Bean
RestTemplateBuilder restTemplateBuilder() {
RestTemplateBuilder restTemplateBuilder = mock(RestTemplateBuilder.class);
RestTemplate restTemplate = mock(RestTemplate.class);
ResponseEntity responseEntity = mock(ResponseEntity.class);
given(restTemplateBuilder.build()).willReturn(restTemplate);
given(restTemplate.execute(any(), any(), any(), any())).willReturn(responseEntity);
given(responseEntity.getBody()).willReturn("{}");
return restTemplateBuilder;
}
@Bean
DogTasklet sut() {
return new DogTasklet("string", restTemplateBuilder());
}
}
@Test
public void execute() throws Exception {
// when
sut.execute(stepContribution, chunkContext);
}
}
【问题讨论】:
-
您确定您调用了正确的
restTemplate#execute方法吗?因为该方法重载了很多,并且可能是您的when不起作用,因为您调用了错误的方法。 -
非常感谢!事实上我什至没有使用 execute() 而是 exchange()...
-
是的,
exchange,我在那儿弄糊涂了,抱歉 :) 很高兴你能成功。干杯!
标签: java spring unit-testing mockito bdd