如何在动态创建的TestCase上运行PowerMock

时间:2014-07-10 07:22:28

标签: java junit mockito powermock

我试图模拟我的测试套件。我的测试框架通过扫描磁盘上的测试文件来创建测试用例。因此每次动态创建测试用例。 我试图使用PowerMock。以下是我首先尝试的事情。

public class GroupTestcase_T extends TestSuite {
     static void run() {
         scan();
         junit.textui.TestRunner.run(g);
     }
     static void scan() {
         // scan disk
         for (MyTestCase t : tests) { addTest(t); }
     }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToStub.class)
public class MyTestCase extends TestCase {
     public MyTestCase(TestInfo info) {...}

     @Override
     protected void setUp() throws Exception {
         PowerMockito.mockStatic(ClassToStub.class);
         when(ClassToStub.methodToStub())
                .thenReturn(new FakeProxy());
     }
     @Test
     public void test() throws Exception {
         // Test!
     }
}

以上代码似乎不起作用:

  

此外,此错误可能会显示,因为:   1.你存在以下任何一个:final / private / equals()/ hashCode()方法。      这些方法无法进行存根/验证。   2.在()内部,你不是在模拟上调用方法,而是在某些其他对象上调用方法。   3.模拟类的父母不公开。      这是模拟引擎的限制。

我跟踪代码,发现根本没有调用PowerMockRunner。 我还尝试用PowerMockRunner手动强制Junit运行它:

Result result = junit.run(new PowerMockRunner(MyTestCase.class));

PowerMockRunner只有一个构造函数将测试类作为参数。我的测试用例每次都不同,但都属于同一个类。

如果动态创建TestCase,是否知道如何使用PowerMock? 我使用的是Junit 4 / PowerMock 1.5

1 个答案:

答案 0 :(得分:0)

您可以使用parameterized tests功能生成测试并应用@PowerMockRule

import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;

@RunWith(Parameterized.class)
@PrepareForTest(ClassToStub.class)
public class MyTestCase{
    @Parameters
    public static Collection<Object[]> scan() {
        return Arrays.asList(new Object[][] {
        { new TestInfo() }, { new TestInfo() } });
    }

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    public MyTestCase(TestInfo info) {
        // ...
    }

    @Test
    public void test() throws Exception {
        PowerMockito.mockStatic(ClassToStub.class);
        PowerMockito.when(ClassToStub.methodToStub()).thenReturn(new FakeProxy());
        assertTrue(ClassToStub.methodToStub() instanceof FakeProxy);
    }
}

请注意,在您的示例中,您正在混合使用junit 3(extends TestSuiteprotected setUp)和junit 4(@Test)测试定义。