Java 如何在动态创建的测试用例上运行PowerMock

Java 如何在动态创建的测试用例上运行PowerMock,java,junit,mockito,powermock,Java,Junit,Mockito,Powermock,我试图模仿我的测试套件。我的测试框架通过扫描磁盘上的测试文件来创建测试用例。因此,每次动态创建测试用例时。 我试图使用PowerMock。下面是我第一次尝试的东西 public class GroupTestcase_T extends TestSuite { static void run() { scan(); junit.textui.TestRunner.run(g); } static void scan() {

我试图模仿我的测试套件。我的测试框架通过扫描磁盘上的测试文件来创建测试用例。因此,每次动态创建测试用例时。 我试图使用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.在when()中,您不在mock上调用方法,而是在其他对象上调用方法。 3.模拟类的父级不是公共的。 这是模拟引擎的一个限制

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

Result result = junit.run(new PowerMockRunner(MyTestCase.class));
PowerMockRunner只有一个构造函数将测试类作为参数。我的测试用例每次都不同,但都共享同一个类

如果测试用例是动态创建的,你知道如何使用PowerMock吗?
我使用的是JUnit4/PowerMock 1.5,您可以使用该功能生成测试并应用

import static org.junit.Assert.assertTrue;
导入java.util.array;
导入java.util.Collection;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.Parameterized;
导入org.junit.runners.Parameterized.Parameters;
导入org.powermock.api.mockito.PowerMockito;
导入org.powermock.core.classloader.annotations.PrepareForTest;
导入org.powermock.modules.junit4.rule.PowerMockRule;
@RunWith(参数化的.class)
@PrepareForTest(ClassToStub.class)
公共类MyTestCase{
@参数
公共静态集合扫描(){
返回Arrays.asList(新对象[][]{
{new TestInfo()},{new TestInfo()}});
}
@统治
public PowerMockRule rule=新的PowerMockRule();
公共MyTestCase(TestInfo信息){
// ...
}
@试验
public void test()引发异常{
mockStatic(ClassToStub.class);
when(ClassToStub.methodToStub()).thenReturn(new-FakeProxy());
assertTrue(FakeProxy的ClassToStub.methodToStub()实例);
}
}
注意,在您的示例中,您混合了JUnit3(
扩展测试套件
受保护的设置
)和JUnit4(
@Test
)测试定义

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);
    }
}