如何使用Mockito解决ClassCastException?

时间:2017-09-07 16:34:43

标签: java junit mockito

我正在为我获得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

2 个答案:

答案 0 :(得分:0)

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

更多详情:

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

答案 1 :(得分:0)

您嘲笑您的对象是 ResendDocumentsServiceRequest

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

换句话说:预期为A,提供为B.这仅适用于B extends AB implements A。从这个意义上说:这与嘲弄本身无关。但事实上,你以某种方式为你的生产代码提供了一个B对象...而应该是A类型。当您在“真实生产运行时”执行此操作时 - 您将遇到相同的错误。

但是我们不能告诉你A)你为什么这样做,B)正确的解决方案是什么。正如你所说,这些是两个析取类 - 你必须确定这个失败是否实际暴露了你的生产代码中的一个错误(假设对象可以这样投射) - 或者在你的测试设置中。