在单元测试时,有时候为了方便构造mock的方法返回的数据,使用doAnswer很方便,但是在mock的静态方法中使用doAnswer时,需要注意一下它的写法。
正确的写法是:
要测试的静态方法类
//要测试的静态方法类public class XinyueGameUtils {/*** 根据分区id,获取所在的服务器的id** @param sectionId* @return*/public static List<String> getGameServerIds(Collection<String> sectionId) {//一些操作忽略掉return new ArrayList<>();}}
单元测试代码 ```java
@PrepareForTest({XinyueGameUtils.class}) //这里先准备要mock的静态方法 public class XinyueGameUtilsTest extends PowerMockTestCase {
@Testpublic 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");}
}
3. 之前错误的写法```java@Testpublic 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");}
