将PowerMockRunner与Junit Test Suite配合使用

时间:2015-09-04 22:44:18

标签: java junit mockito powermock powermockito

我正在尝试使用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的任何建议吗?

由于

2 个答案:

答案 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(或任意位置)适用的测试类别。希望这会有所帮助。