我正在尝试使用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:测试类只能有一个构造函数
在org.junit.runners.model.TestClass。(TestClass.java:40)
关于在上述情况下如何使用
PowerMockRunner
的任何建议?谢谢
最佳答案
这是一个老问题,因此我们可能无法确定该解决方案是否适用于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
(或任何地方)中创建模拟。希望这可以帮助。