如何使用 Mockito 解析 ClassCastException?



我正在为一种方法编写一个JUnit测试用例,我正在获得ClassCastException。当请求对象设置实体时,我收到此异常。serviceRequest.setEntity((ResendDocumentsRequest)request);

被测方法

public Object invokeService(String key, Object request) {
if( UiIntegrationKeyConstants.RESEND_DOCUMENTS.equals( key ) ) {
ResendDocumentsServiceResponse serviceResponse = null;
try {
ESignatureClient client = (ESignatureClient) AppContext.getBean("eSignatureRestClient");
ResendDocumentsServiceRequest serviceRequest = client.getResendDocumentsServiceRequest();
serviceRequest.setEntity((ResendDocumentsRequest)request);
serviceResponse = client.resendDocuments(serviceRequest);
} catch (ESignatureClientException e) {
log.error("Exception while retrieving documents Detail "+ e.getMessage());
}
return serviceResponse.getEntity();
}
}

JUnit 测试用例

private ResendDocumentsServiceRequest resendDocumentsServiceRequest;
private ResendDocumentsServiceResponse resendDocumentsServiceResponse;
@SuppressWarnings("unchecked")
@Before
public void setUP() {
mockStatic( AppContext.class );
esignatureClient = mock( ESignatureClient.class );
resendDocumentsServiceRequest = mock( ResendDocumentsServiceRequest.class );
resendDocumentsServiceResponse = mock( ResendDocumentsServiceResponse.class );
}
@Test
public void testESignatureClientException() {
ESignatureServiceInvoker invoker = new ESignatureServiceInvoker();
PowerMockito.when( AppContext.getBean( eq( "eSignatureRestClient" ) ) ).thenReturn( esignatureClient );
when( esignatureClient.getResendDocumentsServiceRequest() ).thenReturn( resendDocumentsServiceRequest );
try {
doThrow( new ESignatureClientException() ).when( esignatureClient ).resendDocuments( resendDocumentsServiceRequest );
resendDocumentsServiceResponse = ( ResendDocumentsServiceResponse ) invoker.invokeService( UiIntegrationKeyConstants.RESEND_DOCUMENTS , resendDocumentsServiceRequest );
} catch ( ESignatureClientException ex ) {
assertNotNull( ex );
}
}

堆栈跟踪:

java.lang.ClassCastException: com.whatever.ResendDocumentsServiceRequest$$EnhancerByMockitoWithCGLIB$$15a76565 cannot be cast to com.whatever.ResendDocumentsRequest

你嘲笑你的对象是一个ResendDocumentsServiceRequest

生产代码需要一个ResendDocumentsRequest的实例。

换句话说:预期是A,前提是是B。这只有在B extends AB implements A时才有效。从这个意义上说:这与嘲笑本身无关。但是事实上,您以某种方式为您的生产代码提供了一个 B 对象......它应该是类型 A 代替。当您在"实际生产运行时"执行此操作时,也会遇到相同的错误。

但是我们不能告诉你A)你为什么这样做,也不能告诉你B)正确的解决方案是什么。正如您所说,这是两个分离类 - 您必须确定此失败是否实际上暴露了生产代码中的错误(通过假设对象可以以这种方式转换) - 或测试设置中。

简短回答: Junit 中的resendDocumentsServiceRequest对象必须扩展或实现ResendDocumentsRequest类或接口。

更多详情:

  1. 创建一个静态类(在 junit 测试类中),该类既扩展ResendDocumentsServiceRequest类又实现ResendDocumentsRequest接口。 我称之为TestKapow类。
  2. resendDocumentsServiceRequest对象的类型更改为TestKapow
  3. 喜悦。

相关内容

  • 没有找到相关文章

最新更新