我正在尝试使用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(或任何地方)中创建模拟。希望这可以帮助。

07-24 18:58