【问题标题】:Spring unit test of restTemplateBuilder.setConnectTimeout(..).setReadTimeout(..).build() throws null pointer exceptionrestTemplateBuilder.setConnectTimeout(..).setReadTimeout(..).build() 的 Spring 单元测试抛出空指针异常
【发布时间】:2021-09-17 21:19:53
【问题描述】:

单元测试

RestTemplate restTemplate =restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(connectTimeout)).setReadTimeout(Duration.ofSeconds(readTimeout))

抛出空指针异常。

我嘲笑过 RestTemplateBuilder, RestTemplate 无法理解是哪个字段导致了 NPE

下面是示例代码:

@Service
public class MySeriveClass{
@Autowired
RestTemplateBuilder restTemplateBuilder;
private int connectTimeout=10;
private int readTimeout = 10;
public boolean restTemplate_check()
{
   RestTemplate restTemplate  = restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(connectTimeout))
                .setReadTimeout(Duration.ofSeconds(readTimeout))
                .build();
//more code
return true;
}
}
//class end

单元测试代码:

public class MySeriveClass_Test {

@InjectMocks
MySeriveClass mySeriveClass;

@Test 
public void restTemplate_check_test()
{
        RestTemplateBuilder restTemplateBuilder = mock(RestTemplateBuilder.class);
        RestTemplate restTemplate = mock(RestTemplate.class);
        //bellow line throws null pointer exception
        org.mockito.BDDMockito.given(restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(10))
          .setReadTimeout(Duration.ofSeconds(10)).build()).willReturn(restTemplate);

        org.mockito.BDDMockito.given( mySeriveClass.restTemplate_check()).willReturn(true);
        org.junit.Assert.assertEquals(true,  mySeriveClass.restTemplate_check());
}
}//test class ends

【问题讨论】:

  • 你能添加堆栈跟踪吗?你的 resttemplatebuilder 是在哪里定义的?你能告诉我它是如何变得狂热的吗?
  • @ParthManaktala RestTemplateBuilder 在服务类中自动装配。

标签: junit mockito spring-boot-test


【解决方案1】:

下面的测试工作正常。

@ExtendWith(MockitoExtension.class)
class MySeriveClass_Test  {

    @Mock
    private RestTemplateBuilder restTemplateBuilder;

    @InjectMocks
    Service mySeriveClass;

    @Test
    void restTemplate_check_test() {
        RestTemplate restTemplate = mock(RestTemplate.class);
        // Broke the below line instead of all at once
        org.mockito.BDDMockito.given(restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(10)))
            .willReturn(restTemplateBuilder);

        org.mockito.BDDMockito.given(restTemplateBuilder.setReadTimeout(Duration.ofSeconds(10)))
            .willReturn(restTemplateBuilder);

        org.mockito.BDDMockito.given(restTemplateBuilder.build()).willReturn(restTemplate);

        assertEquals(true, mySeriveClass.restTemplate_check());
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多