《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(16) https://developer.aliyun.com/article/1232402?groupCode=java
4. 兼容Pandora等容器问题
阿里巴巴的很多中间件,都是基于Pandora容器的,在编写单元测试用例时,可能会遇到一些坑。
原始方法:
@Slf4j public class MetaqMessageSender { @Autowired private MetaProducer metaProducer; public String sendMetaqMessage(String topicName, String tagName, String messageKey, String messageBody) { try { // 组装消息内容 Message message = new Message(); message.setTopic(topicName); message.setTags(tagName); message.setKeys(messageKey); message.setBody(messageBody.getBytes(StandardCharsets.UTF_8)); // 发送消息请求 SendResult sendResult = metaProducer.send(message); if (sendResult.getSendStatus() != SendStatus.SEND_OK) { String msg = String.format("发送标签(%s)消息(%s)状态错误(%s)", tagName, messageKey, sendResult.getSendStatus()); log.warn(msg); throw new ReconsException(msg); } log.info(String.format("发送标签(%s)消息(%s)状态成功:%s", tagName, messageKey, sendResult.getMsgId())); // 返回消息标识 return sendResult.getMsgId(); } catch (MQClientException | RemotingException | MQBrokerException | InterruptedException e) { // 记录消息异常 Thread.currentThread().interrupt(); String message = String.format("发送标签(%s)消息(%s)状态异常:%s", tagName, messageKey, e.getMessage()); log.warn(message, e); throw new ReconsException(message, e); } } }
测试用例:
问题现象:
执行单元测试用例失败,抛出以下异常信息:
原因分析:
基于Pandora容器的中间件,需要使用Pandora容器加载。在上面测试用例中,使用了PowerMock容器加载,从而导致抛出类加载异常。
解决方案:
首先,把PowerMockRunner替换为PandoraBootRunner。其次,为了使@Mock、@InjectMocks等Mockito注解生效,需要加上注解@DelegateTo(MockitoJUnitRunner.class)进行初始化。
《Java单元测试实战》——编写方法:Java编程技巧之单元测试用例编写流程(18) https://developer.aliyun.com/article/1232399?groupCode=java