我这里有一个小问题,我不知道如何解决。
我有一个类,它必须对一些JSF bean进行测试。为了实现这一点,我使用PowerMock和Mockito来模拟FacesContext、RequestContext和JSF bean中使用的另一个静态方法。
@PrepareForTest(ClassWithStaticMethods.class)
@RunWith(PowerMockRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTestingClass extends SomeTestBaseClass{
@BeforeClass
public static void init() throws Exception{
//mocking the FacesContext and others
}
@Test
public void test0001Create(){}
@Test
public void test0002Edit(){}
@Test
public void test0003Delete(){}
}
SomeTestBaseClass,没什么复杂的。
public abstract class SomeTestBaseClass {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
//...
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
//...
}
}
问题是忽略了测试的顺序(即使使用FixMethodOrder注释)。如果我删除PowerMockRunner(和RunWith注释),则会保留顺序,但对静态(和void)方法的mocking不起作用。但是将类留给PowerMockRunner,注释@FixMethodOrder被完全忽略。
我甚至尝试过MockitoJUnitRunner,这里保持了测试的顺序,但没有完成对静态(和void)方法的嘲讽。
有人知道为什么会发生这种事吗?
感谢
我在让它们按正确的顺序运行时遇到了同样的问题。我使用@PowerMockRunnerDelegate
注释解决了这个问题。
在我的测试类注释中:
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(PowerMockRunner.class)
我添加了@PowerMockRunnerDelegate(JUnit4.class)
:
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(JUnit4.class)
它们现在按预期顺序运行。我相信这是有效的,因为运行测试的不是PowerMock,而是JUnit4本身。
类似于一个变通方法:创建一个新方法(比如说"testAll"),只为此放置@Test注释(从其他方法中删除@Test注释),然后在已注释的方法中调用测试方法。
脏,但它工作。
@PrepareForTest(ClassWithStaticMethods.class)
@RunWith(PowerMockRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTestingClass extends SomeTestBaseClass{
@BeforeClass
public static void init() throws Exception{
//mocking the FacesContext and others
}
@Test
public void testAll(){
this.test0001Create();
this.test0002Edit();
this.test0003Delete();
}
public void test0001Create(){}
public void test0002Edit(){}
public void test0003Delete(){}
}
请尝试更改序列:
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStaticMethods.class)
我不知道为什么它不能与PowerMockRunner
注释一起使用,而是可以使用PowerMockRule
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTestingClass extends SomeTestBaseClass {
@Rule
public PowerMockRule rule = new PowerMockRule();
@BeforeClass
public static void init() throws Exception {
// mocking the FacesContext and others
}
@Test
public void test0001Create() {
}
@Test
public void test0002Create() {
}
@Test
public void test0003Create() {
}
}