【问题标题】:How to resolve ClassCastException using Mockito?如何使用 Mockito 解决 ClassCastException?
【发布时间】:2017-09-07 16:34:43
【问题描述】:

我正在为我得到一个ClassCastException 的方法编写一个JUnit 测试用例。当请求对象设置实体时,我收到此异常。 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

【问题讨论】:

标签: java junit mockito


【解决方案1】:

您将对象模拟为 ResendDocumentsServiceRequest

生产代码需要 ResendDocumentsRequest 的实例。

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

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

【讨论】:

    【解决方案2】:

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

    更多详情:

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

    【讨论】:

    • 我不太确定您的解决方案。 ResendDocumentsRequest 不是接口,我不能扩展两个类。
    • 如果是这种情况,代码(当前正在编译)将无法编译。 ResendDocumentsServiceRequest 是一个接口吗?如果不是,请参阅此评论的第一句话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多