我试图模拟我的测试套件。我的测试框架通过扫描磁盘上的测试文件来创建测试用例。因此每次动态创建测试用例。 我试图使用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
答案 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 TestSuite
,protected setUp
)和junit 4(@Test
)测试定义。