Powermockito doAnswer 在静态方法中使用

1,260 阅读1分钟

在单元测试时,有时候为了方便构造mock的方法返回的数据,使用doAnswer很方便,但是在mock的静态方法中使用doAnswer时,需要注意一下它的写法。

正确的写法是:

  1. 要测试的静态方法类
//要测试的静态方法类
public class XinyueGameUtils {
    /**
     * 根据分区id,获取所在的服务器的id
     *
     * @param sectionId
     * @return
     */
    public static List<String> getGameServerIds(Collection<String> sectionId) {
        //一些操作忽略掉

        return new ArrayList<>();
    }
}
  1. 单元测试代码
@PrepareForTest({XinyueGameUtils.class}) //这里先准备要mock的静态方法
public class XinyueGameUtilsTest extends PowerMockTestCase {

    @Test
    public void testGetGameServerIds() throws Exception {
        //先mock静态方法
        PowerMockito.mockStatic(XinyueGameUtils.class);
        PowerMockito.doAnswer(invocation -> {
            //返回测试需要的参数
            List<String> serverIds = new ArrayList<>();
            serverIds.add("1");
            return serverIds;
        }).when(XinyueGameUtils.class, "getGameServerIds", Mockito.anyCollection());

        List<String> serverIds = XinyueGameUtils.getGameServerIds(new ArrayList<>());
        Assert.assertEquals(serverIds.get(0), "1");
    }
}
  1. 之前错误的写法
@Test
    public void testGetGameServerIds() throws Exception {
        //先mock静态方法
        PowerMockito.mockStatic(XinyueGameUtils.class);
        PowerMockito.doAnswer(invocation -> {
            //返回测试需要的参数
            List<String> serverIds = new ArrayList<>();
            serverIds.add("1");
            return serverIds;
            //错误之处在于when方法的调用,不能直接调方法
        }).when(XinyueGameUtils.getGameServerIds(new ArrayList<>()));

        List<String> serverIds = XinyueGameUtils.getGameServerIds(new ArrayList<>());
        Assert.assertEquals(serverIds.get(0), "1");
    }

\


\