在单元测试时,有时候为了方便构造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 {
@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");
}
}
3. 之前错误的写法
```java
@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");
}