ResponseEntity 在 Resttemplate JUNIT 调用中为 null
ResponseEntity Coming as null in Resttemplate JUNIT Call
为 GET REST 调用编写 JUNIT-5
我的实际实现如下所示,工作正常。
ResponseEntity<OrderDocument> responseEntity = restTemplate.exchange(
URL,HttpMethod.GET,new HttpEntity<>(headers),OrderDocument.class,
message.getPayload().toString());
responseEntity.getBody() // Null pointer Exception when calling from JUNIT
我的 JUNIT 完整实现如下
@SpringBootTest
@ActiveProfiles("test")
class OrderMasterClientImplTest {
@Autowired
OrderMasterClientImpl orderMasterClient;
private ConsumerMessage consumerMessage;
private EventMessage eventMessage;
@MockBean
@Qualifier("orderMasterRestTemplate")
private RestTemplate restTemplate;
@MockBean
ResponseEntity responseEntity;
@BeforeEach
public void setUp() throws Exception {
ObjectMapper objectMapper= new ObjectMapper();
eventMessage = objectMapper.readValue(
this.getClass().getClassLoader().getResourceAsStream(
"event_message.json"),
EventMessage.class);
System.out.println( " "+eventMessage.getOrderId());
consumerMessage = new ConsumerMessage(eventMessage);
System.out.println( " consumerMessage "+consumerMessage.getPayload());
}
@Test
void consume() {
when(restTemplate.exchange(anyString() , any(HttpMethod.class) ,
any(HttpEntity.class) ,any(Class.class) , any(String.class)
)).thenReturn(responseEntity);
System.out.println( " consumerMessage "+consumerMessage.getPayload());
OrderDocument orderDocumentactual =
orderMasterClient.consume(consumerMessage);
Assertions.assertNotNull(orderDocumentactual);
}
}
我做错了什么。请帮忙
在你的存根中,尝试使用any(OrderDocument.class)
而不是任何(Class.class)
当服务器 returns 除了实际的成功响应之外,以这种方式模拟 restTemplate
可能会导致意外行为。我建议使用 MockRestServiceServer,因为这提供了更好的测试。
如果您确实想继续当前的方法 - 您似乎要返回一个 responseEntity
,它是由 @MockBean
注释创建的模拟。我没有在您的问题中看到任何代码来定义当有人对其调用 getBody()
时该模拟的行为方式。这可能值得一看。您可以定义要在模拟中返回的真实 ResponseEntity
,或者模拟与 responseEntity
的所有交互。
为 GET REST 调用编写 JUNIT-5 我的实际实现如下所示,工作正常。
ResponseEntity<OrderDocument> responseEntity = restTemplate.exchange(
URL,HttpMethod.GET,new HttpEntity<>(headers),OrderDocument.class,
message.getPayload().toString());
responseEntity.getBody() // Null pointer Exception when calling from JUNIT
我的 JUNIT 完整实现如下
@SpringBootTest
@ActiveProfiles("test")
class OrderMasterClientImplTest {
@Autowired
OrderMasterClientImpl orderMasterClient;
private ConsumerMessage consumerMessage;
private EventMessage eventMessage;
@MockBean
@Qualifier("orderMasterRestTemplate")
private RestTemplate restTemplate;
@MockBean
ResponseEntity responseEntity;
@BeforeEach
public void setUp() throws Exception {
ObjectMapper objectMapper= new ObjectMapper();
eventMessage = objectMapper.readValue(
this.getClass().getClassLoader().getResourceAsStream(
"event_message.json"),
EventMessage.class);
System.out.println( " "+eventMessage.getOrderId());
consumerMessage = new ConsumerMessage(eventMessage);
System.out.println( " consumerMessage "+consumerMessage.getPayload());
}
@Test
void consume() {
when(restTemplate.exchange(anyString() , any(HttpMethod.class) ,
any(HttpEntity.class) ,any(Class.class) , any(String.class)
)).thenReturn(responseEntity);
System.out.println( " consumerMessage "+consumerMessage.getPayload());
OrderDocument orderDocumentactual =
orderMasterClient.consume(consumerMessage);
Assertions.assertNotNull(orderDocumentactual);
}
}
我做错了什么。请帮忙
在你的存根中,尝试使用any(OrderDocument.class)
而不是任何(Class.class)
当服务器 returns 除了实际的成功响应之外,以这种方式模拟 restTemplate
可能会导致意外行为。我建议使用 MockRestServiceServer,因为这提供了更好的测试。
如果您确实想继续当前的方法 - 您似乎要返回一个 responseEntity
,它是由 @MockBean
注释创建的模拟。我没有在您的问题中看到任何代码来定义当有人对其调用 getBody()
时该模拟的行为方式。这可能值得一看。您可以定义要在模拟中返回的真实 ResponseEntity
,或者模拟与 responseEntity
的所有交互。