我正在试验 jMock 作为我的项目的模拟框架。我遇到了需要模拟类和接口的情况。我使用
ClassImposteriser.INSTANCE
来启动上下文的冒名顶替者。
假设有一个类
Validator
和一个要模拟的接口 Person
。当我要模拟接口Person
时,我遇到了一个问题NoClassFoundDefError
。当我嘲笑班级时Validator
,没有问题。
我需要该类和接口,但我无法解决问题。 请帮忙。
代码示例:
嘲讽
private Mockery context = new JUnit4Mockery() {{ setImposteriser(ClassImposteriser.Class) }};
班级:
private Validator validator;
接口:
private Person person;
内部测试方法
----> 工作validator = context.Mock(Validator.class);
---->person = context.Mock(Person.class);
NoClassFoundDefError
您提供的代码将无法编译(它应该是 ClassImposteriser.INSTANCE)。下面的示例代码似乎工作正常。也许您可以提供更多细节?
public class Example {
private Mockery context = new JUnit4Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
@Test
public void testStuff() {
Validator validator = context.mock(Validator.class);
Person person = context.mock(Person.class);
// do some stuff...
}
public static interface Person {
}
public static class Validator {
}
}
由于这个问题在搜索中不断出现,而且有点过时了,我决定贡献一个答案。
正如 @bm212 和 @Ogre Psalm33 在他们的回答和评论中已经说过的,为了生成具体类的模拟,我们需要为 JMock 版本配置
Mockery
的 Imposteriser
和 ClassImposteriser.INSTANCE
2.11.0 之前,而 JMock 2.11.0 上有 ByteBuddyClassImposteriser.INSTANCE
。
从 jmock 2.11.0 开始,
已被弃用,取而代之的是名称奇怪的ClassImposteriser
。 https://github.com/jmock-developers/jmock-library/blob/master/jmock-legacy/src/main/java/org/jmock/lib/legacy/ClassImposteriser.javaByteBuddyClassImposteriser
但是,
ClassImposteriser.INSTANCE
配置 (JMock < 2.11.0) works only up to JDK 15. While, the solution with ByteBuddyClassImposteriser.INSTANCE
(JMock >= 2.11.0) 适用于每个 JDK,尽管有 JDK 14 的额外依赖项。对 byte-buddy 依赖项的要求在注释部分中报告官方 JMock 的 GitHub 存储库中的问题 #204。就个人而言,如果没有 byte-buddy 依赖,ByteBuddyClassImposteriser.INSTANCE
配置也不适用于 JDK 12 和 13。
我所有的 JMock 测试都是从 JDK 8 到 21 进行的。在撰写此答案时,JDK 21 是最新的 JDK。
Mockery context = new JUnit5Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
Mockery context = new JUnit5Mockery() {
{
setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
}
};