【问题标题】:RestTemplateBuilder mocked with @MockBean is null用 @MockBean 模拟的 RestTemplateBuilder 为空
【发布时间】:2019-02-03 20:40:36
【问题描述】:

我想测试一个Tasklet 实现,它使用@Autowired RestTemplateBuilder 来构建RestTemplateRestTemplate 执行请求。我想模拟这个请求的响应。

@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


【解决方案1】:

感谢 Urosh,我发现我在 given() 声明中嘲笑了错误的方法。因此它没有返回模拟的RestTemplate

我将given() 更改为:

        given(restTemplate.exchange(
            anyString(),
            eq(HttpMethod.GET),
            any(HttpEntity.class),
            eq(String.class)
        )).willReturn(responseEntity);

【讨论】:

    猜你喜欢
    • 2020-02-28
    • 2018-08-14
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多