java - 如何使用 Mockito 解决 ClassCastException?

标签 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

最佳答案

您将对象模拟为ResendDocumentsServiceRequest

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

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

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

关于java - 如何使用 Mockito 解决 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46101316/

相关文章:

java - Android 输入流。读取缓冲区直到特定字符

java - 使用 AES 加密的 Android 中内存不足异常

java - 使用 GUICE 注入(inject) HttpClient 以在 Java 中获取模拟响应

java - Robolectric 和 Mockito 监视 Android Activity

spring-boot - Mockito 应该在 Spring 4 中与 MockMvc 的 webAppContextSetup 一起使用吗?

static - 使用 PowerMock 通过 @InjectMocks 模拟静态属性

java - 由 Alarm Manager 触发的 Pending Intent 似乎会立即触发

java - 如何在Java中运行tshark来实时获取数据包?

java - Junit 测试 - Jackson toString 中的 Eclemma 覆盖率

java - JUnit、Mockito 和 Powermock 访问 protected 本地方法