使用注入 java 和 spring boot 的 RestTemplate 类进行单元测试

Posted

技术标签:

【中文标题】使用注入 java 和 spring boot 的 RestTemplate 类进行单元测试【英文标题】:Unit test using class with RestTemplate injected with java and spring boot 【发布时间】:2019-11-21 10:40:29 【问题描述】:

我正在使用注入了 RestTemplate 的类运行单元测试,并且只有在我运行测试时,RestTemplate 在使用我正在使用的 API 后才会变为 null。

class ReceitaWsIntegrationImpl implements ReceitaWsIntegration 

  private static final String URL_RECEITA_WS_CNPJ
    = "https://www.receitaws.com.br/v1/cnpj";

  private final RestTemplate restTemplate;

  @Override
  public void findByCnpj(String cnpj) 
    ResponseEntity<CnpjResource> forEntity = restTemplate.getForEntity(
      URL_RECEITA_WS_CNPJ.concat("/").concat(cnpj), CnpjResource.class);
  

测试类:

public class ReceitaWsIntegrationImplTest extends TestSupport 

private static final String CNPJ = "27865757000102";
private static final String URL_RECEITA_WS_CNPJ = "https://www.receitaws.com.br/v1/cnpj/";
@Mock
private RestTemplate restTemplate;
private ReceitaWsIntegration receitaWsIntegration;

    @Override
    public void init() 
        receitaWsIntegration = new ReceitaWsIntegrationImpl(restTemplate);
    

    @Test
    public void should_find_company_by_cnpj() 
        receitaWsIntegration.findByCnpj(CNPJ);

        InOrder inOrder = inOrder(restTemplate);

        inOrder.verify(restTemplate, times(1))
            .getForEntity(URL_RECEITA_WS_CNPJ.concat(CNPJ), CnpjResource.class);
        inOrder.verifyNoMoreInteractions();
    

【问题讨论】:

你可以使用RefelectionTestUtils.setFielddocs.spring.io/spring/docs/current/javadoc-api/org/… @Before注释init方法你应该很好 【参考方案1】:

您的测试似乎没有创建RestTemplate 对象,因为没有处理注释@Mock 的代码。创建模拟有不同的方法。例如。您可以在init 方法中初始化模拟。

@Override
public void init() 
    MockitoAnnotations.initMocks(this);
    receitaWsIntegration = new ReceitaWsIntegrationImpl(restTemplate);

更多选项请查看Mockito's Javadoc。

【讨论】:

【参考方案2】:

坦率地说,我在findByCnpj() 中看不到任何需要自己进行单元测试的内容。我认为您不需要测试 RestTemplate.getForEntity() 方法,因为它已被 Spring 开发人员(和测试人员)多次测试。而且findByCnpj()里面也没有额外的逻辑

【讨论】:

以上是关于使用注入 java 和 spring boot 的 RestTemplate 类进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Java - Spring boot - 集成测试 - TestEntityManager 没有被注入

如何解决 java spring boot 应用程序中的安全审计查找日志注入

Java框架spring Boot学习笔记:基于构造函数的依赖注入

Java精选面试题之Spring Boot 三十三问

Spring Boot 测试:bean 未注入

Spring Boot入门