Powermock和Mockito。 在模拟和存根同一个类时,避免对类进行静态初始化
假设我有一个名为Util的类,带有静态字段:
public class Util { public static field = Param.getValue("param1"); }
并且Param类看起来像这样:
public class Param { public static field = SomeClass.getValue("someValue"); }
我想在Util中模拟和stubb Param.getValue(“param1”),但同时我想要抑制Param类的静态初始化。 我怎样才能做到这一点?
这是我的第一次尝试,但它不起作用
@RunWith(PowerMockRunner.class) @PrepareForTest({Param.class}) @SuppressStaticInitializationFor("py.com.company.Param") public class Test { @Test public void testSomeMethod() { PowerMockito.mockStatic(Param.class); when(Param.getValue("value1")).thenReturn("someValue1"); } }
这对我有用。 我没有输出,而SomeClass#getValue
如果没有@SuppressStaticInitializationFor
:
@RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor({"so35047166.Param"}) @PrepareForTest({Param.class}) public class UtilTest { @Before public void setUp() throws Exception { PowerMockito.mockStatic(Param.class); } @Test public void testFoo() throws Exception { final Util util = new Util(); assertEquals("Util#foo", util.foo()); assertEquals(null, Util.field); } }
有:
// all in package so35047166; public class Util { public static String field = Param.getValue("param1"); public String foo() { return "Util#foo"; } } public class Param { public static String field = SomeClass.getValue("someValue"); public static String getValue(final String in) { System.out.println("Param#getValue"); return "Param#getValue"; } } public class SomeClass { public static String getValue(final String in) { System.out.println("SomeClass#getValue"); return "SomeClass#getValue"; } }