我有一个接口,List
其实现包括单链接列表,双重,循环等.我为Singly编写的单元测试应该对大多数双重以及循环和接口的任何其他新实现都有好处.因此,JUnit不是为每个实现重复单元测试,而是提供内置的东西,让我有一个JUnit测试并针对不同的实现运行它?
使用JUnit参数化测试我可以提供不同的实现,如Singly,doublely,circular等,但是对于每个实现,相同的对象用于执行类中的所有测试.
我想在测试活动中测试一个片段.我添加TestTragmentActivity
到androidTest
连同AndroidManifest.xml
文件.但是,当我尝试通过ActivityTestRule
它使用此活动时,会出现以下错误:
java.lang.RuntimeException: Could not launch activity
at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:371)
at android.support.test.rule.ActivityTestRule.launchActivity(ActivityTestRule.java:219)
at com.bbm.ui.fragments.StickerPackListFragmentTest.testEmpty(StickerPackListFragmentTest.java:29)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at …
Run Code Online (Sandbox Code Playgroud) android unit-testing junit-runner android-espresso android-instrumentation
我有一个使用spring-boot版本的spring-boot应用程序1.5.9.RELEASE
.要测试这个应用程序,我想使用junit-jupiter版本5.0.2
.
对于简单的服务测试,它没有任何问题.但是当谈到测试休息端点时,我失败了.原因是@RunWith(SpringRunner.class)
注释,我使用junit4将所有内容连接在一起.
SpringRunner
在spring-boot 2之前有junit5吗?
更新
我实现了一个继承自BlockJUnit4ClassRunner的运行器类A.class,以便我可以用@RunWith(A.class)注释测试.与此同时,某人 else用RunWith(Parameterized.class)注释测试.很明显,我们不能同时使用两个@RunWith.
如何解决这个问题呢?或者如何合并这两个@RunWith?
没有查看JUnit源本身(我的下一步)是否有一种简单的方法来设置默认Runner用于每个测试而不必在每次测试时设置@RunWith?我们有大量的单元测试,我希望能够在不必更改每个文件的情况下全面添加一些支持.
理想情况下,我希望有类似的东西:-Djunit.runner ="com.example.foo".
是否有一种干净的方式来运行参数化的jUnit 4测试而不更改跑步者,即不使用
@RunWith(Parameterized.class)
?
我有单元测试,需要一个特殊的跑步者,我不能用这个替换Parameterized
.也许有某种"跑步者链",所以我可以同时在两个跑步者?(只是猜测......)
我一直试图通过创建一个扩展跑步者的suiterunner来创建一个个性化的测试套件.在带有注释的测试套件中,@RunWith(suiterunner.class)
我指的是需要执行的测试类.
在测试类中,我需要重复一个特定的测试,为此我正在使用这里提到的解决方案:http://codehowtos.blogspot.com/2011/04/run-junit-test-repeatedly.html.但是因为我创建了一个触发测试类的suiterunner并且在我正在实现的测试类中@RunWith(ExtendedRunner.class)
,所以抛出了初始化错误.
我需要帮助来管理这两个跑步者,还有什么方法可以将两个跑步者组合起来进行特定测试吗?有没有其他方法可以解决这个问题或任何更简单的方法来继续?
根据PowerMock文档,我应该能够使用a PowerMockRule
而不是@RunWith(PowerMockRunner.class)
得到相同的结果.
我似乎找到了一个不存在这种情况的案例.
以下示例运行良好:
package com.test.powermockstatics;
import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
final class FinalClassWithStaticCall {
public static int getIntStatic() {
return 1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(FinalClassWithStaticCall.class)
public class TestStaticMockingWithoutPowerMockRunner {
@Test
public void testStaticCall() {
mockStatic(FinalClassWithStaticCall.class);
when(FinalClassWithStaticCall.getIntStatic()).thenReturn(2);
assertEquals(FinalClassWithStaticCall.getIntStatic(), 2);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当切换到这样的规则时:
package com.test.powermockstatics;
import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Rule;
import org.junit.Test;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.agent.PowerMockAgent;
import org.powermock.modules.junit4.rule.PowerMockRule; …
Run Code Online (Sandbox Code Playgroud) 我有一堆JUnit测试扩展了我的基本测试类BaseTest
,而后者又进行了扩展Assert
.我的一些测试有一个@Category(SlowTests.class)
注释.
我的BaseTest
类使用以下注释进行注释@RunWith(MyJUnitRunner.class)
.
我已经设置了一个预期只运行的Gradle任务SlowTests
.这是我的Gradle任务:
task integrationTests(type: Test) {
minHeapSize = "768m"
maxHeapSize = "1024m"
testLogging {
events "passed", "skipped", "failed"
outputs.upToDateWhen {false}
}
reports.junitXml.destination = "$buildDir/test-result"
useJUnit {
includeCategories 'testutils.SlowTests'
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行任务时,我的测试没有运行.我已经确定这个问题与自定义跑步者MyJUnitRunner
有关BaseTest
.如何设置我的Gradle或测试结构,以便在使用时可以使用自定义运行器Suite
.
我目前正在创建一个单元自定义JUnit运行器(它将在每个测试方法之前/之后精确调用自定义代码),例如
class MyRunner extends BlockJUnit4ClassRunner {
private MyApi api = new MyApi();
public MyRunner(Class<?> klass) throws InitializationError {
super(klass);
}
// todo
}
Run Code Online (Sandbox Code Playgroud)
不过,我想支持其他选手如MockitoJunitRunner
和SpringRunner
这样的,而不是重新发明轮子,我想用我的亚军如下内容(使用自定义MyConfig
批注指定现有的测试跑步者): -
@RunWith(MyRunner.class)
@MyConfig(testRunner=MockitoJUnitRunner.class)
public class MockitoRunnerTest {
}
Run Code Online (Sandbox Code Playgroud)
... 要么 ...
@RunWith(MyRunner.class)
@MyConfig(testRunner=SpringRunner.class)
public class MockitoRunnerTest {
}
Run Code Online (Sandbox Code Playgroud)
这意味着测试运行器非常轻,即它类似于Junit规则,并在调用它自己的代码后简单地代理另一个现有的Junit运行器.
我的直觉是,这已经得到实施/解决 - 只是遇到了问题.
注意:由于这些问题,我想避免使用规则 - 请参阅每个'@Test'后的'@Rule'和JUnit中每个'@After'之前的应用'@Rule'
junit-runner ×10
junit ×7
unit-testing ×4
java ×3
junit4 ×2
android ×1
annotations ×1
gradle ×1
junit-rule ×1
junit5 ×1
mockito ×1
powermock ×1
suite ×1