我有一个代码,我想进行单元测试。代码使用Collections.sort
方法,为其提供我们自己的甜蜜比较器,例如:
List<Something> something = somethingService.doSomething(someParameter);
Collections.sort(something, somethingComparator);
现在,在测试函数时,我模拟somethingService
并stub doSomething
方法,如:
List<Something> mockList = Mockito.mock(List.class);
Mockito.when(somethingService.doSomething(anyInt())).thenReturn(mockList);
和我嘲笑集合为:
PowerMockito.mockStatic(Collections.class);
PowerMockito.doNothing().when(Collections.class, "sort", anyListOf(Something.class), anyOf(Comparator.class));
但是它给了我:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced argument matcher detected
You cannot use argument matchers outside of verification or stubbing.
现在我确实知道,如果我们在函数的任何参数中使用参数匹配器,我们需要为所有参数提供匹配器。但是这里有可能做同样的事情,如果没有,那么现有的解决方案是什么?
您正在使用PowerMock来模拟JDK中的系统类,从设计角度来看,它真的非常非常讨厌。严肃地说,我们应该好好考虑一下作者自己使用Powermock的动机。
Powermock不能真正直接模拟系统类中的静态方法,您必须在系统调用周围创建包装器,如wiki中所述。
我强烈建议您提取一些排序策略,您可以使用Mockito进行模拟。