我想测试使用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的测试,现在在
null ResponseEntity
期间具有sut.execute()
。@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);
}
}
最佳答案
感谢Urosh,我发现我在given()
语句中嘲笑了错误的方法。因此,它没有返回模拟的RestTemplate
。
我将given()
更改为:
given(restTemplate.exchange(
anyString(),
eq(HttpMethod.GET),
any(HttpEntity.class),
eq(String.class)
)).willReturn(responseEntity);