能否模拟Java协议缓冲区消息?

19

协议缓存类被标记为final,可能是出于效率的考虑; 但这使得它们很难进行测试 - Mockito无法对最终类进行模拟/跟踪。我尝试使用PowerMockito,但没有成功:当准备测试获得final类时,我收到一个ClassFormatError错误。

我到目前为止的解决方法是创建可模拟适配器接口,但我希望有更简单的方法。


3
我不明白为什么你需要嘲笑一个 protobuf 消息类。如果你需要在测试中使用它,只需按照正常方式创建即可。如果你想要模拟一个服务,可以只模拟 ServiceClass.Interface。 - Geoff Reedy
@Geoff:这是一个很好的观点,使用一些简单的值在许多情况下都可以工作--我希望使用RETURNS_MOCKS功能来避免构建更复杂的消息并验证消息的某些部分是否被读取。我将尝试下面提到的其他模拟框架,看看它们如何运行。 - cdleary
@geoffreedy 但是...... 以通常的方式创建类会将我的单元测试变成集成测试。:'( - devinbost
在proto2中(其中required vs. optional是一个概念),有些情况下核心逻辑只针对给定消息的特定子集的required字段才能发挥作用(但仍然具有足够大的字段基数,需要将整个消息传递到方法中)。在这样的白盒UT中,我确实不应该关心构造所有其他逻辑无关的"required"字段。 - Zhuiguang Liu
2个回答

2

JMockit可以处理finalstatic。只需要注意如何设置它,因为它需要使用-javaagent JVM参数,或者对类路径进行微调,或者添加额外的注释才能模拟finalstatic


JMockit无法使用java.lang.ExceptionInitializerError对它们进行模拟。 - cdleary
你尝试过所有的javaagent重定义操作吗?如果你想要模拟一个系统/核心Java类,你需要覆盖JVM引导类路径。也许你的测试缺少注释?很抱歉我不能提供更多帮助。我不熟悉你想要模拟的类或者你的方法。 - aberrant80
实际上,让JMockit测试工作起来应该很容易:只需将-javaagent:<proper path>/jmockit.jar添加为JVM启动参数,或者在使用JDK 1.6时将jmockit.jar添加到junit-xyz.jar之前的类路径中。如果仍然失败,请在JMockit用户讨论组中发布您的具体问题。 - Rogério

1

JDave有一个Unfinalizer,可以与JMock ClassImposteriser集成。

它无法取消加载自引导类加载器的类的最终状态,并且在启动测试时需要一个VM参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接