如何模拟一个 class 标记为 final 并使用 jMockit 拥有一个私有构造函数
How do I mock a class marked final and has a private constructor using jMockit
我想使用 JMockit
编写一些基于状态的测试来模拟 CSVRecord。问题是 CSVRecord
是 final
(这意味着我必须使用像 JMockit
这样的模拟框架)并且 CSVRecord's
构造函数具有包私有可见性。
因为它是包私有的,我不能调用 new CSVRecord(arg, arg, ...)
,这意味着我永远不能实例化我的模拟。
它的父级 CSVParser 是唯一可以创建实例的 class。
JMockit
有办法处理这种情况吗?
注意:JMockit
或 Mockito
是我们在此项目中使用的唯一框架。没有其他框架是可以接受的。我的偏好是使用模型。
如果只是调用私有构造函数的问题,那么是的,JMockit 有处理这个问题的工具。见 tutorial
听起来更像是 CSVRecord
不是嘲讽的好人选。如果可能,针对另一个在内部使用它的 public class 的测试将是更可取的。
否则,JMockit 提供了 Deencapsulation
class 和 newInstance
方法。
附带说明一下,Mockito 仅支持基于行为的测试; JMockit提供了"mock-ups"(MockUp
),但是和写纯状态的黑盒测试不一样
使用:
ConstructorReflection.newInstance
在较新版本的 Jmockit 中。
我想使用 JMockit
编写一些基于状态的测试来模拟 CSVRecord。问题是 CSVRecord
是 final
(这意味着我必须使用像 JMockit
这样的模拟框架)并且 CSVRecord's
构造函数具有包私有可见性。
因为它是包私有的,我不能调用 new CSVRecord(arg, arg, ...)
,这意味着我永远不能实例化我的模拟。
它的父级 CSVParser 是唯一可以创建实例的 class。
JMockit
有办法处理这种情况吗?
注意:JMockit
或 Mockito
是我们在此项目中使用的唯一框架。没有其他框架是可以接受的。我的偏好是使用模型。
如果只是调用私有构造函数的问题,那么是的,JMockit 有处理这个问题的工具。见 tutorial
听起来更像是 CSVRecord
不是嘲讽的好人选。如果可能,针对另一个在内部使用它的 public class 的测试将是更可取的。
否则,JMockit 提供了 Deencapsulation
class 和 newInstance
方法。
附带说明一下,Mockito 仅支持基于行为的测试; JMockit提供了"mock-ups"(MockUp
),但是和写纯状态的黑盒测试不一样
使用:
ConstructorReflection.newInstance
在较新版本的 Jmockit 中。