我想测试使用Tasklet @Autowired构建RestTemplateBuilderRestTemplate实现。 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);

09-15 15:20