代码之家  ›  专栏  ›  技术社区  ›  yN.

用@MockBean模拟的RestTemplateBuilder为空

  •  2
  • yN.  · 技术社区  · 7 年前

    我想测试一下 Tasklet 使用 @Autowired RestTemplateBuilder 建立一个 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 . 我错过了什么?

    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);
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   yN.    7 年前

    多亏了乌罗什,我才发现自己在嘲笑自己的错误方法 given() 声明。因此,它没有返回嘲笑 RestTemplate .

    给定()

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