问题标签 [jmockit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
48894 浏览

java - 在 Java 中模拟静态块

我对 Java 的座右铭是“仅仅因为 Java 有静态块,并不意味着你应该使用它们。” 撇开玩笑不谈,Java 中有很多技巧让测试成为一场噩梦。我最讨厌的两个是匿名类和静态块。我们有很多使用静态块的遗留代码,这些是我们推动编写单元测试的恼人点之一。我们的目标是能够以最少的代码更改为依赖此静态初始化的类编写单元测试。

到目前为止,我对同事的建议是将静态块的主体移动到私有静态方法中并调用它staticInit。然后可以从静态块中调用此方法。对于依赖于这个类的另一个类的单元测试,可以很容易地staticInitJMockit模拟不做任何事情。让我们看看这个例子。

将改为

这样我们就可以在JUnit中执行以下操作。

然而,这种解决方案也有其自身的问题。您不能在同一个 JVM 上运行DependentClassTest和运行,ClassWithStaticInitTest因为您实际上希望静态块运行ClassWithStaticInitTest.

完成这项任务的方法是什么?或者任何更好的、非基于 JMockit 的解决方案,您认为它们会更干净?

0 投票
3 回答
3938 浏览

java - 将 jmockit 期望与匹配器和原始类型一起使用

我正在使用 jmockit 进行单元测试(使用 TestNG),并且我在使用 Expectations 类来模拟一个使用匹配器将原始类型(布尔值)作为参数的方法时遇到了麻烦。这是一些说明问题的示例代码。

包含对 invokeReturning(...) 的调用的行会引发 NullPointerException。

如果我将此调用更改为不使用匹配器,如下所示:

它工作得很好。这对我没有好处,因为在我的真实代码中,我实际上是在模拟一个多参数方法,我需要在另一个参数上使用匹配器。在这种情况下,Expectations 类要求所有参数都使用匹配器。

我很确定这是一个错误,或者可能无法将 Matchers 与原始类型一起使用(这会让我感到难过)。有没有人遇到过这个问题,并且知道如何解决它?

0 投票
3 回答
4500 浏览

java - How to mock the InitialContext class with jmockit?

I'm using jmockit with my tests and with one class I wish to test, uses InitialContext directly. So I have the following:

In my test case, I call this to use my "mocked" InitialContext class:

What is the best way to mock the InitialContext class with jmockit.

I've already tried a few ways (such as using my own MockInitialContextFactory), but keeping stumbling into the same error:

From what I can see on Google, mocking with JNDI is quite nasty. Please can anyone provide me with some guidance, or point me to a solution? That would be much appreciated. Thank you.

0 投票
2 回答
11220 浏览

java - 如何对使用 ProcessBuilder 和 Process 的 Java 方法进行单元测试?

我有一个 Java 方法,它使用 ProcessBuilder 启动一个进程,并将其输出通过管道传输到一个字节数组中,然后在进程完成时返回它的字节数组。

伪代码:

对这种方法进行单元测试的最佳方法是什么?我还没有找到模拟 ProcessBuilder 的方法(它是最终的),即使使用非常棒的JMockit,它也会给我一个 NoClassDefFoundError:

有什么想法吗?


答案- 正如 Olaf 建议的那样,我最终将这些行重构为一个界面

我现在将这个接口的一个实例传递给我想要测试的类(在它的构造函数中),通常使用带有原始行的默认实现。当我想测试时,我只需使用接口的模拟实现。就像一个魅力,虽然我想知道我是否在这里过度接口......

0 投票
2 回答
2826 浏览

java - 尝试使用 JMockit Coverage 时出现 NoClassDefFoundError

我正在尝试使用 JMockit 的代码覆盖能力。使用 JVM 参数

我能够运行我的测试(jmockit.jar 和 coverage.jar 在类路径上),不幸的是我的日志文件说:

...并且没有生成覆盖文件。有没有人让 JMockit Coverage 工作?如果是这样,关于是什么导致此错误的任何想法?谢谢...

回答我需要为引导条目添加覆盖范围,而不仅仅是用户条目(在 Eclipse 运行配置中)

实际答案实际答案是我使用 JUnit 3 运行测试,但覆盖范围需要 JUnit 4。这解决了问题,我不必添加任何引导条目。

0 投票
2 回答
1888 浏览

eclipse - 在 Eclipse 中运行测试时,有没有办法使用自定义 JUnit Test Runner?

我想使用JMockit的增量测试运行程序,而不是 Eclipse 中的标准 JUnit 测试运行程序。有没有办法做到这一点?

编辑收到我给 JMockit 开发人员的电子邮件的以下答复:

您需要使用命令行启动 JVM,例如“-javaagent:jmockit.jar=incjunit4”,其中“incjunit4”指定加载用于增量 JUnit 测试的外部工具。还必须使用覆盖工具,因为它为增量测试工具提供了必要的运行时信息。事实上,没有关于这方面的文档,主要是因为这个功能还没有完全开发出来。

不幸的是,这仍然对我不起作用。有没有人让增量测试运行器工作?

0 投票
2 回答
4356 浏览

java - 使用 JMockit 在抽象类中模拟非公共静态方法?

我有以下课程:

我想模拟这种方法。我决定使用JMockit。所以我创建了一个模拟类:

我的测试代码如下所示:

不幸的是,这个测试表明 AbstractParent 返回“OriginalOutput”而不是“MOCK”。任何想法为什么?难道我做错了什么?我也尝试将我的模拟类声明为抽象类,但无济于事。

编辑请注意,公开该方法会导致测试运行没有问题......这很奇怪,因为使用 JMockit 您应该能够模拟任何范围的方法。

回答只有模拟方法需要公开,您可以保持原始方法不变。

0 投票
2 回答
951 浏览

java - 使用 EMMA 获取 ClassFormatError?

我正在尝试使用EMMA生成代码覆盖率报告,其中一些测试使用JMockit作为模拟框架。在大多数情况下,它可以工作,但我的一些测试因 ClassFormatError 而崩溃,如下所示:

知道发生了什么,我是否可以解决问题?或者 EMMA 和 JMockit 是互斥的?

0 投票
3 回答
13401 浏览

java - JMockit 中有没有办法从模拟方法调用原始方法?

在我的模拟类中,我正在模拟方法 foo()。对于某些测试用例,我希望 foo() 的模拟实现返回一个特殊值。对于其他测试用例,我想使用 foo() 的真正实现。我在我的模拟类中定义了一个布尔值,以便我可以在模拟方法中确定是要返回特殊值还是使用“真实”方法。问题是,我似乎无法弄清楚如何从模拟方法中调用真正的方法。

我发现您可以在名为“it”的模拟对象中定义一个特殊成员(具有被模拟对象的类型)。这允许您从模拟实现中引用真实的类。所以,我的计划是,如果我需要调用 foo() 的“真实”实现,模拟方法将调用 it.foo()。但是,这不起作用,因为调用 it.foo() 只是再次调用模拟版本,而不是真实版本,所以我最终得到了无限递归。

有什么办法可以使这项工作?

编辑:使用代码示例可能会更清楚,这是我当前的模拟方法实现的样子:

编辑 2:另外,对于我的大多数测试用例,我想要模拟实现。所以我最初的尝试是只在我需要模拟对象的那些测试用例中调用 Mockit.redefineMethods() 。但这不起作用 - 似乎你只能在 setup/teardown 中做到这一点......当我尝试这样做时,我的模拟实现从未被调用过。

解决方案注意事项:

起初我不认为给出的答案有效,但在玩了一些之后,似乎问题在于我将 JMockit “核心”方法与“注释”驱动方法混合在一起。显然,在使用注释时,您需要使用 Mockit.setupMocks,而不是 Mockit.redefineMethods()。这就是最终奏效的方法:

然后,对于模拟类:

0 投票
2 回答
2701 浏览

variables - mocking superclass protected variable using jmockit

I couldnt able to mock the protected varibale defined in the superclass.i could able to mock the protected method in superclass but couldnt to mock the protected variable in to the subclass ,wherein am writing the testcase for subclass,Please if anybody out there has any soluton for it .please reply.

Thanks Shashi