我正在尝试使用Junit
创建PowerMockRunner
测试套件,但它不起作用。
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(MainTest.class)
@Suite.SuiteClasses({ MainTest.Class1Test.class })
@PrepareForTest({
StaticFieldsProvider.class
})
public class MainTest extends Suite {
public MainTest(Class<?> klass, RunnerBuilder builder)
throws InitializationError {
super(klass, builder);
}
public static class TestBase {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(StaticFieldsProvider.class);
}
}
public static class Class1Test extends TestBase {
@Before
public void setUp() {
super.setUp();
}
@Test
public void test(){
assertTrue(true);
}
}
}
当我尝试运行时,它失败并出现错误 -
java.lang.IllegalArgumentException:Test类只能有一个构造函数 在org.junit.runners.model.TestClass。(TestClass.java:40)
有关如何在上述情况下使用PowerMockRunner
的任何建议吗?
由于
答案 0 :(得分:0)
您不能扩展Suite
,因为这是JUnit 3的一部分,并且您正在使用JUnit 4.(删除extends
和构造函数。)有关更多信息,请参阅JUnit Wiki关于JUnit 4套房的数据。
答案 1 :(得分:0)
这是一个古老的问题,因此我们可能无法确定该解决方案是否适用于OP;但这可能有效(如果无法访问StaticFieldsProvider
,我将无法验证,但是如果我将其换成自己的一个类,它将可以工作)。我希望有人可以编辑并添加更多有关此功能的解释:
@RunWith(PowerMockRunner.class)
// * Delegate to Suite.class instead of MainTest.class *
@PowerMockRunnerDelegate(Suite.class)
@Suite.SuiteClasses({ MainTest.Class1Test.class })
@PrepareForTest({
StaticFieldsProvider.class
})
// * Don't extend Suite *
public class MainTest {
// * Remove constructor *
public static class TestBase {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
PowerMockito.mockStatic(StaticFieldsProvider.class);
}
}
public static class Class1Test extends TestBase {
@Before
public void setUp() {
super.setUp();
}
@Test
public void test(){
assertTrue(true);
}
}
}
万一它对其他人有帮助,我会遇到一个稍微不同的情况,即我套件中的几个类只需要PowerMockRunner
(并且不要嘲笑同一件事,因此需要进行模仿在每个单独的测试课程中,而不是在跑步者中)。看来,只要我@PrepareForTest
在我的跑步者(如上)中某些测试类中需要的类上,我仍然可以在@Before
(或任意位置)适用的测试类别。希望这会有所帮助。