我无法在 JUnit 测试用例中测试下面提到的方法并获取 ClassCastException

I am unable to test the below mentioned method in JUnit testcase and getting ClassCastException

对于下面的方法,我正在为 sonarqube 覆盖编写 JUnit 测试用例。

    @Transformer
    public Object errorUnWrapper(Message<?> message) {
        String value = "";
        try {
            if (!errorFlag) {               
                value = errorTransform(ESBConstants.SYSTEMERRCODE, ESBConstants.SYSTEMERROR, ESBConstants.SYSTEMTEXT);
                
            } else {                
                value = getbankholiday.getErrorMessage();
            }
        } catch (Exception e) {
            getbankholiday.getE2EObject().logMessage("3005", "Error Occurred in error unwrapper");          
            value = ESBConstants.SYSTEMERRORXML;            
        }
        MessageHeaders headers = ((MessagingException) message.getPayload()).getFailedMessage().getHeaders();
        return MessageBuilder.withPayload(value).copyHeaders(message.getHeaders())
                .copyHeadersIfAbsent(headers).setHeader(ESBConstants.CONTENTTYPE, ESBConstants.CONTENTVALUE)
                .build();
    }

JUnit 测试用例:

@Test
    void testErrorUnWrapper() throws IOException {
        String xml = FileUtils.readFileToString(new File("src/test/resources/JunitTestCases/input/TC02_wltRequest.xml"),
                "UTF-8");
        test = MessageBuilder.withPayload(xml).build();
        errorTransform.errorUnWrapper(test);
        Assertions.assertTrue(true);
    }

但是,无法模拟或测试 JUnit 测试用例中的以下行。

MessageHeaders headers = ((MessagingException) message.getPayload()).getFailedMessage().getHeaders();

异常:

java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.messaging.MessagingException
    at com.bt.or.esb.exceptions.ErrorTransform.errorUnWrapper(ErrorTransform.java:75)
    at com.bt.or.esb.exceptions.ErrorTransformTest.testErrorUnWrapper(ErrorTransformTest.java:87)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

这通常意味着您需要重构。 除了 value 之外,其他所有内容在 if elsecatch

中都很常见

为什么不先计算值然后在下面两行执行?

MessageHeaders headers = ((MessagingException) message.getPayload()).getFailedMessage().getHeaders();
return MessageBuilder.withPayload(value).copyHeaders(message.getHeaders()).copyHeadersIfAbsent(headers)
                    .setHeader(ESBConstants.CONTENTTYPE, ESBConstants.CONTENTVALUE).build();

您的高效代码

(MessagingException) message.getPayload()

表示您希望 message.payload 成为 MessagingException。但是在你的测试中,你创建了

MessageBuilder.withPayload(xml).build()

所以有效负载将是一个字符串。您需要使用 MessagingException 作为有效负载来构建消息。