如何模拟一个 class 标记为 final 并使用 jMockit 拥有一个私有构造函数

How do I mock a class marked final and has a private constructor using jMockit

我想使用 JMockit 编写一些基于状态的测试来模拟 CSVRecord。问题是 CSVRecordfinal(这意味着我必须使用像 JMockit 这样的模拟框架)并且 CSVRecord's 构造函数具有包私有可见性。

因为它是包私有的,我不能调用 new CSVRecord(arg, arg, ...),这意味着我永远不能实例化我的模拟。 它的父级 CSVParser 是唯一可以创建实例的 class。

JMockit有办法处理这种情况吗?

注意:JMockitMockito 是我们在此项目中使用的唯一框架。没有其他框架是可以接受的。我的偏好是使用模型。

如果只是调用私有构造函数的问题,那么是的,JMockit 有处理这个问题的工具。见 tutorial

听起来更像是 CSVRecord 不是嘲讽的好人选。如果可能,针对另一个在内部使用它的 public class 的测试将是更可取的。

否则,JMockit 提供了 Deencapsulation class 和 newInstance 方法。

附带说明一下,Mockito 仅支持基于行为的测试; JMockit提供了"mock-ups"(MockUp),但是和写纯状态的黑盒测试不一样

使用:

ConstructorReflection.newInstance

在较新版本的 Jmockit 中。