问题标签 [junit-runner]

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 投票
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 投票
3 回答
1721 浏览

junit - JUnit - 必须返回数组集合错误

如何将 EmployeeDetails.class 的列表传递给 JUnit 参数化类。

请帮助我编写参数方法

// 这会抛出类似“employeeList must return a Collection of arrays”的错误。

上面的 EmployeeDetails 类是一个例子。我需要将它用于类似的类,我将在其中发送类对象的列表。

0 投票
0 回答
1920 浏览

unit-testing - 我可以添加一个可以在测试类之间而不是测试用例之间调用的 junit 侦听器吗?

我遇到了一个问题,单元测试正在修改类的静态状态Foo而不是自行清理。这意味着一个单元测试在它自己运行时可能会通过,但是当其他单元测试在它之前运行时会失败,因为状态已经改变。

我一直在通过代码寻找那些改变静态状态Foo并添加必要清理的测试,但后来我有了另一个想法:为什么不使用 junit 测试侦听器来检查Foo每个测试运行后的静态状态,如果Foo处于修改状态则失败?然后我会自动获得每个构建的顽皮测试列表,并且可以在将来识别任何类似的问题。

所以我实现了一个 junitRunListener并修改了 mypom.xml以将侦听器添加到maven-surefire-plugin,并验证了每个测试用例都执行了侦听器。

简单的解决方案是覆盖testFinished()方法RunListener并检查静态状态:

这将适用于以下形式的测试:

}

在每个测试用例之后,@After调用该方法并清理状态。然后testFinished()调用junit run listener的方法,验证状态是否已经重置。如果我删除该@After方法,则运行侦听器将按预期引发错误。

这里的问题是testFinishedjunit run listener的方法是在单元测试的@BeforeClass任何方法之后和之前调用的。@AfterClass如果单元测试在 a 中修改了 Foo 的状态@BeforeClass并在方法中进行了清理@AfterClass,那么testFinished监听器的方法将看到修改后的状态并错误地引发错误:

这里,testFinished()run listener的方法是在被调用之后testCase1()testCase2()已经被调用,但是在@AfterClass方法被调用之前,所以状态Foo仍然是修改的,run listener会报错。这不是正确的行为。

一般来说,对于两个单元测试TestATestB一个 junit 运行监听Listener器,调用顺序似乎是:

  • Listener.testRunStarted()
  • TestA.@BeforeClass
  • Listener.testStarted("TestA.testCase1)
  • 测试A.@之前
  • 测试A.testCase1()
  • 测试A.@之后
  • Listener.testFinished(TestA.testCase1)
  • Listener.testStarted("TestA.testCase2)
  • 测试A.@之前
  • 测试A.testCase2()
  • 测试A.@之后
  • Listener.testFinished(TestA.testCase2)
  • 测试A.@AfterClass
  • TestB.@BeforeClass
  • Listener.testStarted("TestB.testCase1)
  • 测试B.@之前
  • TestB.testCase1()
  • 测试B.@之后
  • Listener.testFinished(TestB.testCase1)
  • TestB.@AfterClass
  • Listener.testRunFinished()

我想要的是在为单元测试调用该方法之后以及在下一个单元测试调用@AfterClass该方法之前执行修改状态的检查。@BeforeClass这样我可以确保单元测试(如果不是单独的测试用例)执行必要的清理并且仍然尊重测试语义。

但是我看不到使用 junitRunListener和使用 maven surefire 插件调用测试的方法。

这里有解决方案吗?

编辑:将junit类规则添加到检查状态的现有测试不是一个选项,因为我需要将它添加到现在存在的每个测试以及将来添加的每个测试中。如果可能的话,我想要一些能够自动发现任何违规行为的东西。

编辑:这里的根本问题是 Maven 模块的每个单元测试都在同一个 JVM 中运行。我尝试在自己的 JVM 中运行每个单元测试(通过设置 surefire 的分叉选项),但测试运行时间太长。所以我坚持使用单个 JVM 进行多个单元测试。

编辑:当然,首先使用静态方法是不好的设计,重构注入状态是首选,但在这个阶段重构超过 1,000,000 行的遗留代码库不是一个选项。

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 中的错误?或已知的限制;为什么?

0 投票
5 回答
2050 浏览

android - 如何在android的Robotium自动化脚本中打开导航抽屉菜单

我有一个带有导航抽屉的应用程序,我想在 Robotium 自动化脚本中打开抽屉菜单。我的应用程序最低 Api 级别是 11,所以我使用操作栏 sherlock 来实现操作栏。请以正确的方式引导我

0 投票
0 回答
604 浏览

java - 将有关测试的附加信息从 JUnit Runner 传递给 RunListener

我正在实现一个自定义 JUnit Runner,并希望为其添加额外的报告功能。我还想尽可能多地重用现有的 JUnit 基础设施,所以实现一个RunListener听起来不错的主意。RunListener采用 aDescription或 a 的方法Failure,两者都没有明显的方法来添加有关测试用例的附加信息。

Description实际上是最终的,因为它没有公共构造函数,因此无法覆盖它。有一个私有uniqueId字段可以通过反射被滥用,但这真的很hacky。

一个稍微不那么 hacky 的变体可能是为我需要的所有信息定义注释,并将此注释的实现附加到Description. 有没有人做过这样的事情,或者有没有推荐的方法来处理这个问题?

这是我目前正在尝试的示例:

相关问题,编写注释接口的实现有什么缺点吗?

0 投票
2 回答
3090 浏览

junit-runner - 如果我的 Junit 不是由 Ant 而是由 JunitCore.run 运行,如何生成 html 报告

我在一个项目中工作,其中测试类是通过 JunitCore.run(testClasses) 而不是通过 Ant 运行的,因为即使没有 ANT 框架我也必须运行该项目(因此出于同样的原因没有 Testng)。但我仍然需要创建与 JUNIT/ANT 相同的 html 和 xml 报告。在我的情况下如何生成它们?

现在我发现https://github.com/barrypitman/JUnitXmlFormatter/blob/master/src/main/java/barrypitman/junitXmlFormatter/AntXmlRunListener.java可以用来生成 xml 报告。如何生成类似于 junit-noframes.html 的 html?是否有将 TESTS-TestSuites.xml 转换为 junit-noframes.html 的现有方法以及如何?如果没有,如何生成html?我什至没有找到html格式的标准。

0 投票
0 回答
519 浏览

junit-runner - 如何合并这两个 RunWith 跑步者?

我创建了两个 Runner,它们都继承自 BlockJUnit4ClassRunner。一种是根据条件过滤一些测试。另一种是同时运行测试多个方法。我想同时应用这两个运行器,以便根据条件同时运行测试。

问题是我们不能根据 jUnit 中的Multiple RunWith Statements将多个 @RunWith 注释到相同的测试中。

我的问题是,由于这两个跑步者都是从同一个基类 BlockJUnit4ClassRunner 继承的,我可以将这两个跑步者合并为一个,以便 RunWith 这个跑步者,我可以根据条件并使用并发方式运行测试方法吗?以及如何做到这一点?

这是我创建的两个跑步者:

1) 此运行器根据 FunctionalTestFilter 中定义的一些条件运行测试方法:

2) 这个运行器使用多线程同时运行测试方法:

0 投票
1 回答
1771 浏览

maven - SureFire JUnitCore 和 JUnit4 Runners 有什么区别

Maven 万无一失

它们之间有什么区别?

我注意到,excludedGroups 属性在surefire-junit47 中工作,但在surefire-junit4 中不起作用,为什么?

0 投票
1 回答
2278 浏览

java - JUnit java.lang.AssertionError:未实现

我有一个用 JUnit 测试的 java 类,但我得到一个 java.lang.AssertionError: Unimplemented

对于所有这些方法,我找不到错误

示例:
java.lang.AssertionError:未实现的 demo.model.KiwiantraagstellerTest.testRemoveKiwikiender(KiwiantraagstellerTest.java:262)

java.lang.AssertionError: 未实现
的 demo.model.KiwiantraagstellerTest.testSetAnschrift(KiwiantraagstellerTest.java:30)

... 请帮我

我的课:

使用 JUnit 进行测试: