jMock 模拟类和接口

问题描述 投票:0回答:2

我正在试验 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 

java mocking jmock
2个回答
12
投票

您提供的代码将无法编译(它应该是 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 {
    }
}

0
投票

由于这个问题在搜索中不断出现,而且有点过时了,我决定贡献一个答案。

正如 @bm212 和 @Ogre Psalm33 在他们的回答和评论中已经说过的,为了生成具体类的模拟,我们需要为 JMock 版本配置

Mockery
Imposteriser
ClassImposteriser.INSTANCE
2.11.0 之前,而 JMock 2.11.0 上有
ByteBuddyClassImposteriser.INSTANCE

从 jmock 2.11.0 开始,

ClassImposteriser
已被弃用,取而代之的是名称奇怪的
ByteBuddyClassImposteriser
https://github.com/jmock-developers/jmock-library/blob/master/jmock-legacy/src/main/java/org/jmock/lib/legacy/ClassImposteriser.java

但是,

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。

JMock 2.11.0 之前

最高支持 JDK 15

Mockery context = new JUnit5Mockery() {
   {
      setImposteriser(ClassImposteriser.INSTANCE);
   }
};

来自 JMock 2.11.0

通过字节伙伴依赖支持 JDK 21

支持 JDK 11,无需字节伙伴依赖

Mockery context = new JUnit5Mockery() {
   {
      setImposteriser(ByteBuddyClassImposteriser.INSTANCE);
   }
};
© www.soinside.com 2019 - 2024. All rights reserved.