我有一个稍微复杂的情况,不知道如何处理它。有一个带有私有变量映射的对象(该对象已经初始化)。该类在地图上有一系列操作。
我需要编写单元测试。它将获取私有变量,模拟(或间谍)它,对其执行一些操作,并验证操作的顺序。什么是最好的方式?
public class A{
private Map<String, String> map = new Map()<>;
public void method1(){
map.put("a", "A");
}
public void method2(){
if(map.size() > 0){
map.put("b", "B");
}
}
...
public class UnitTester{
@Test
public void test(){
A ainstance = new A();
Map<String,String> mock = mock(Map.class); //OR Map<String,String> mock = spy(Map.class);
Field f= A.class.getDeclaredField("map");
f.setAccessible(true);
f.set(ainstance, mock);
ainstance.method1();
ainstance.method2();
InOrder inOrder = inOrder(mock);
inOrder.verify(mock, times(2), put(anyString(), anyString())); //Does not work
}
map.put
不会在地图中添加任何内容。不确定这是因为它是一个反射对象,还是有不同的原因。
答案 0 :(得分:3)
您可以利用注释来代替手动使用反射。你也应该根据验证方式改变一下。最后我会使用Spy
代替Mock
,因为在我看来它更适合:
public class UnitTester{
@InjectMocks
private A aInstance;
@Spy
private Map mapSpy;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
@Test
public void test(){
// Act
ainstance.method1();
ainstance.method2();
InOrder inOrder = inOrder(mapSpy);
inOrder.verify(mapSpy).put("a", "A"));
inOrder.verify(mapSpy).put("b", "B"));
}