问题标签 [junit-rule]

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 投票
5 回答
10120 浏览

java - 在 JUnit 4.11 中结合 @ClassRule 和 @Rule

在 JUnit 4.10 及更低版本中,可以将规则同时注释为 @Rule 和 @ClassRule。这意味着规则在上课之前/之后以及每次测试之前/之后被调用。这样做的一个可能原因是设置一个昂贵的外部资源(通过@ClassRule 调用),然后廉价地重置它(通过@Rule 调用)。

从 JUnit 4.11 开始,@Rule 字段必须是非静态的,@ClassRule 字段必须是静态的,因此上述情况不再可能。

有明显的变通方法(例如,明确地将@ClassRule 和@Rule 职责分离为单独的规则),但不得不强制使用两个规则似乎很可惜。我简要地查看了使用@Rule 并推断它是否是第一个/最后一个测试,但我不相信该信息是可用的(至少,它不是直接在描述上可用)。

在 JUnit 4.11 中,是否有一种简洁的方式将 @ClassRule 和 @Rule 功能组合到单个规则中?

谢谢,罗文

0 投票
1 回答
1163 浏览

java - 如何在两个测试类之间共享一个 ExternalResource?

我正在努力理解使用ExternalResource. 文档和其他帖子(Junit @Rule 如何工作?)都提到能够在类内的测试之间共享代码和/或在测试类之间共享代码。

我正在尝试ExternalResource在功能/集成测试中使用数据库连接,但我看不到如何跨类共享该连接。事实上,@Before/@After在这种情况下,我并没有真正看到好处。我是在错误地使用它还是我错过了什么?

0 投票
2 回答
215 浏览

java - 在执行测试之前验证外部系统是否可用的最佳位置是什么?

我们正在使用 JUnit 执行集成测试以及依赖外部测试系统(不一定由我们自己的公司维护)的系统集成测试。

我想知道在运行测试用例之前将检查系统是否可用的代码放在哪里?所以我可以确定是否存在网络或其他问题,而不是测试本身。

JUnit 允许在 JUnit-Rules 中设置测试的某些部分。在规则内设置与外部系统通信的服务并对规则内的外部系统进行一些基本检查(“ping”)是一个好主意吗?或者要存储状态并在测试中使用 JUnit 假设(rule.isAvailable)来避免执行测试?

或者将这个验证码放在自定义的 JUnit Runner 中会更聪明吗?

或者还有其他方法可以做到这一点吗?(只需创建一些实用程序?)

如果某些条件不满足,目标是跳过测试,因为很明显测试会失败。我知道这表明异常处理不好,但是有很多遗留代码我无法完全更改。

我试图自己找一些文章,但似乎搜索词(“测试”、“外部系统”等)有点吃力不讨好。

谢谢!

0 投票
0 回答
90 浏览

junit - 使用 JUnit 理论添加测试

有没有办法使用规则来添加额外的测试?例如,我想将 Theories 运行器转换为规则,但我一直无法找到让规则添加额外测试的方法。

0 投票
1 回答
194 浏览

logging - xwiki logrule 不捕获日志语句

我正在尝试使用 XWiki LogRule 来捕获记录器输出。未捕获任何输出。目前尚不清楚我做错了什么。我已经阅读了相关的代码和文档,并且觉得我已经进行了彻底的搜索 - 一切都无济于事。我选择了这个解决方案,因为它似乎最适合手头的问题。

我正在尝试确定问题的范围以及从 Mockito 1.8.5 迁移到 1.9.5 引起的问题的可能解决方案。我们过去能够插入最终字段,但现在不能 - 我理解为什么 - 使用 @InjectMocks。

一种解决方案是移除最终修饰符。另一种是创建重载的构造函数并手动注入。第一个是难吃的。第二个是丑陋的,因为它引入了仅用于测试的代码,并且在模拟记录器时,记录器是唯一的最终字段。因此,在记录器是唯一问题的情况下,我认为使用 xwiki-commons-test-simple-5.4.1.jar 中提供的 XWiki LogRule 是有意义的。

下面是测试类中规则的实现:

这是测试中规则的执行:

// 验证(logger).info(expectedLogEntry); System.out.println("this.logRule.size() 为 " + this.logRule.size()); System.out.println("this.logRule.toString() 是 " + this.logRule.toString()); assertThat(this.logRule.size(), is(1)); assertThat(this.logRule.getMessage(0), containsString(expectedLogEntry)); assertThat(this.logRule.toString(), containsString(expectedLogEntry)); }

你可以看到我已经尝试了许多变体。对 logRule.size() 的调用返回 0,它应该始终记录一个 INFO 条目。

这是目标类中记录器的定义:

这是正在测试的方法:

这是控制台输出:

如您所见,它确实记录了日志。您还可以看到有一些 slf4j 绑定警告。似乎这些不应该是问题,但一旦发布,就会进一步研究这个角度。

我正在寻找解决此问题的建议,以便 LogRule 将捕获记录的输出。

我意识到 - 在我最初发布之后- 我未能将 logback-test.xml 添加到我的项目中。这样做,测试仍然像以前一样失败,但控制台不同。上面的控制台日志现在反映了这一变化。

这是我的 log4j.xml:

而且,这里是前面提到的 logback-test.xml:

0 投票
5 回答
6338 浏览

java - 仅在 Windows 上运行单元测试

我有一个通过 JNA 进行本机 Windows API 调用的类。如何编写将在 Windows 开发机器上执行但在 Unix 构建服务器上被忽略的 JUnit 测试?

我可以轻松地使用主机操作系统System.getProperty("os.name")

我可以在我的测试中编写保护块:

这个额外的样板代码并不理想。

或者,我创建了一个仅在 Windows 上运行测试方法的 JUnit 规则:

这可以通过将这个带注释的字段添加到我的测试类来强制执行:

在我看来,这两种机制都有缺陷,因为在 Unix 机器上它们会默默地通过。如果可以在执行时以某种方式标记它们会更好@Ignore

有人有替代建议吗?

0 投票
1 回答
855 浏览

java - 是否可以在接口内创建 JUnit 规则

我正在尝试使用 JUnit 创建测试自动化套件。对于所有测试,我想创建一个规则,为此我创建了一个接口并将规则放入其中。我想运行的任何测试都必须实现该接口。它没有引发任何编译器错误,但是,当我的 Test 类实现该接口时,这似乎不起作用。以下是我创建的界面。

或者,我可以将上面的内容创建为一个类并从该类扩展我的所有测试类,我尝试了它并且它工作得很好,但这会阻止我从任何其他类扩展我的测试方法。

有没有办法让我创建适用于我所有测试的规则,而无需从基类扩展?

0 投票
1 回答
415 浏览

java - 在定义一些 TestRules 时从 Suite Runner 与 BlockJUnit4Runner 扩展

我需要编写许多测试。我已经扩展了 JUnit 的 Suite Runner,以便能够添加新的注释,我可以在其中提到几个先决条件类,这些类将在执行任何测试或设置之前执行。我的典型测试如下所示。

我已经重写public void run(final RunNotifier notifier)添加代码所需的代码来触发 BeforeSuite 和 AfterSuite 注释中提到的先决条件和清理操作。

现在,我试图找出如何通过扩展来实现相同的目标BlockJUnit4Runner?我找不到任何与 run 等效的方法来启动执行以覆盖行为。有 runChild 在孩子被执行之前被触发。

我正在寻找这个的原因是我正在尝试在接口中创建几个规则并让我的测试实现它们以便它们可用,但是因为接口元素是静态的并且最终的 JUnit 忽略了这些。在我今天问的另一个问题中,我得到了答案,我可以通过扩展 BlockJUnit4Runner 和覆盖让 JUnit 考虑接口中提到的规则getTestRules()

所以,这就是我想要找出的。

  1. 是否可以扩展 BlockJUnit4Runner 以使其获取测试列表并将它们作为套件运行,并在执行任何测试之前和执行所有测试之后运行一些代码?
  2. 如何扩展 Suite Runner 以考虑在已实现接口中定义的 TestRules?
0 投票
2 回答
4214 浏览

java - 无法使用 JUnitParams 运行 PowerMock

我正在尝试将 PowerMock 与 JUnitParams 一起使用,但是我收到了这个奇怪的错误:

我的测试类如下:

这些是 Maven 依赖项:

依赖关系

根据这篇文章,我可以将 PowerMock 与另一个 JUnit 的跑步者一起使用。但是,我不知道为什么会这样。我在这里做错了什么?

0 投票
3 回答
14198 浏览

junit - 是否可以使用 PowerMockRule 而不是 PowerMockRunner 在最终类上模拟静态方法?

根据PowerMock docs,我应该能够使用 aPowerMockRule而不是运行@RunWith(PowerMockRunner.class)并获得相同的结果。

我似乎找到了一个不正确的案例。

以下示例运行良好:

但是当切换到这样的规则时:

我得到以下异常:

java.lang.IllegalArgumentException:不能在 org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447) 在 org.mockito.cglib.core.DefaultGeneratorStrategy.generate( DefaultGeneratorStrategy.java:25) 在 org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) 在 org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378) 在 org.mockito.cglib .proxy.Enhancer.createClass(Enhancer.java:318) 在 org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:110) 在 org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer .java:62) 在 org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111) at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:60) at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) at com.test .powermockstatics.TestStaticMockingWithoutPowerMockRunner.testStaticCall(TestStaticMockingWithoutPowerMockRunner.java:30) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl .java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 在 org.junit.internal.runners .model.ReflectiveCallable.run(ReflectiveCallable.java:12) 在 org.junit.runners.model。FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java: 49) 在 org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java :50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren( ParentRunner.java:236) 在 org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 在 org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 在 org.junit.runners.ParentRunner.run(ParentRunner.java:309) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit.runner。 TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests( RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 197)在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.runTests(RemoteTestRunner.java:467) 运行(TestExecution.java:38) java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.runTests(RemoteTestRunner.java:467) 运行(TestExecution.java:38) java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

我正在遵循文档的建议:

将 powermock-module-junit4-rule-agent 放在类路径中的 junit 之前

如果这是 PowerMock 中的错误或所需的行为(即,您根本无法使用 a 模拟类static上的方法),是否有人知道官方说法?finalPowerMockRule

编辑:

请参阅Gábor Lipták 回答下评论中的澄清细节。我不想使用静态加载的代理,因为看起来动态加载的代理应该能够完成工作?

我知道静态启动代理会起作用。(不幸的是,这不是我的项目中的一个选项。)那么有谁知道动态加载代理的失败是否是 PowerMock 中的错误?或已知的限制;为什么?