Java 如何在动态创建的测试用例上运行PowerMock
我试图模仿我的测试套件。我的测试框架通过扫描磁盘上的测试文件来创建测试用例。因此,每次动态创建测试用例时。 我试图使用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() {
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);
}
}