@Mocked Provider provider;
public static class Provider {
public static List<Integer> getStaticList() {
return new ArrayList<>();
}
public static List<Integer> test() {
return getStaticList();
}
}
@Test
public void testStatic() {
ArrayList<Object> list = new ArrayList<>();
list.add(1);
new Expectations() {
{
Provider.getStaticList();
result = list;
}
};
assertThat(Provider.test(), JUnitMatchers.hasItem(1));
}
我想模拟(使用JMockit)一个在另一个中调用的静态方法。我怎样才能做到这一点?上述测试失败。永远不会调用真正的Provider.test方法。
答案 0 :(得分:7)
以下代码仅更改testMethod
静态方法的行为,而不会影响其他静态方法。
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Foo.class })
public class Snipets {
@Test
public void hoge() throws Exception {
PowerMockito.spy(Foo.class);
PowerMockito.when(Foo.class, "testMethod").thenReturn("dummy");
String actual = Foo.testMethod();
assertEquals("dummy", actual);
}
}
Foo.java
public class Foo {
public static String testMethod() {
return "foo";
}
}
答案 1 :(得分:2)
我使用了一种非常简单的方法来编写条件答案,如下所示:
PowerMockito.mockStatic(<MyMockedClass>.class, invocation -> {
if (invocation.getMethod().getName().equals("<methodToMockName>")) {
return <mockedValue>;
}
return invocation.callRealMethod();
});
答案 2 :(得分:1)
您可以使用部分模拟:
@Test
public void testStatic() {
new Expectations(Provider.class) {{ Provider.getStaticList(); result = 1; }};
List<Integer> test = Provider.test();
assertTrue(test.contains(1));
}
(上面的测试没有&#34; @Mocked Provider
&#34;字段。)