我们知道,PowerMockito只能准备测试一个最终,静态或私有类,如下所示:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class)
public class SomeClassUnderTest{
@Before
public void setUp() throws Exception {
}
@Test
public void testSomeMethod() throws Exception {
}
}
但是我要测试的方法使用了多个静态类。我想做的事情看起来像:
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClassNumber1.class, SomeClassNumber2.class)
public class SomeClassUnderTest{
但是@PrepareForTest只有一个参数。
编辑:例如,该方法将使用单例,工厂或某些不同类的静态方法。
public class SomeClass {
private Session session;
private Object object;
public void someMethod(int userId) {
Session session = Session.getSession(userId);
Object object = Singleton.getInstance();
}
}
注意:此问题可以通过使用单一责任原则解决。例如与其在将要测试的方法中使用单例,不如将其提取到另一个如下方法并进行模拟:
public class SomeClass {
private Session session;
private Object object;
public void someMethod(int userId) {
session = getSession(userId);
object = getInstance();
}
private getSession(userId) {
return Session.getSession(userId);
}
private Object getInstance(){
return Singleton.getInstance();
}
}
但这对我来说似乎也不是一个好的解决方案。如果PowerMockito或其他测试工具具有可以同时模拟多个静态类的功能,则更好。
最佳答案
编辑:例如,该方法将使用单例,工厂或某些不同类的静态方法。
首先,您不应该对类成员和方法使用静态访问,还应该避免使用Java singelton模式。还有其他方法可以确保在运行时只有一个类的实例。
写完这些可以回答您的问题:
@PrepareForTest只有一个参数。
这个单独的参数可以是一个数组:
@PrepareForTest({Class1.class,Class2.class})
关于java - 如何通过PowerMockito模拟几个静态类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41517885/