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

    1. 要测试的静态方法类

      1. //要测试的静态方法类
      2. public class XinyueGameUtils {
      3. /**
      4. * 根据分区id,获取所在的服务器的id
      5. *
      6. * @param sectionId
      7. * @return
      8. */
      9. public static List<String> getGameServerIds(Collection<String> sectionId) {
      10. //一些操作忽略掉
      11. return new ArrayList<>();
      12. }
      13. }
    2. 单元测试代码 ```java

    @PrepareForTest({XinyueGameUtils.class}) //这里先准备要mock的静态方法 public class XinyueGameUtilsTest extends PowerMockTestCase {

    1. @Test
    2. public void testGetGameServerIds() throws Exception {
    3. //先mock静态方法
    4. PowerMockito.mockStatic(XinyueGameUtils.class);
    5. PowerMockito.doAnswer(invocation -> {
    6. //返回测试需要的参数
    7. List<String> serverIds = new ArrayList<>();
    8. serverIds.add("1");
    9. return serverIds;
    10. }).when(XinyueGameUtils.class, "getGameServerIds", Mockito.anyCollection());
    11. List<String> serverIds = XinyueGameUtils.getGameServerIds(new ArrayList<>());
    12. Assert.assertEquals(serverIds.get(0), "1");
    13. }

    }

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