使用注入 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.setField
docs.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 应用程序中的安全审计查找日志注入