1 mock/spy
1.1 mock
List mockedList = mock(LinkedList.class);
List interfaceList = mock(List.class);
mock(LinkedList.class,Mockito.RETURNS_DEFAULTS);
mock(LinkedList.class,withSettings().defaultAnswer(Mockito.RETURNS_DEFAULTS));
mock(LinkedList.class,Mockito.RETURNS_SMART_NULLS);
mock(LinkedList.class,Mockito.RETURNS_MOCKS);
mock(LinkedList.class,Mockito.RETURNS_DEEP_STUBS);
mock(LinkedList.class,Mockito.CALLS_REAL_METHODS);
mock(LinkedList.class,Mockito.RETURNS_SELF);
1.2 spy
spy(LinkedList.class);
List list = new ArrayList();
spy(list);
1.3 @Mock/@Spy/@InjectMocks/@Captor/@MockBean/@SpyBean
1.3.1 如何使这些注解生效
- 在测试类上使用:@RunWith(MockitoJUnitRunner.class)
- 在 @Before 中调用:MockitoAnnotations.initMocks(this)
- 在类中定义:@Rule public MockitoRule mockito = MockitoJUnit.rule();
1.3.2 作用
@Mock/@Spy:相当于 mock/spy 的快捷方式
@InjectMocks:注解的对象相对于 spy 对象,并且可以将 mock/spy 对应的对象自动注入到此对象对应的属性中
@Captor:可以获取 Matcher 实际执行时对应的参数
@MockBean/@SpyBean:相对于 @Mock/@Spy,并且此注释的对象,被加入到 spring 容器中
1.3.3 @InjectMocks 使用
- https://www.jianshu.com/p/bb705a56f620
2 when/then
- 有两种形式
- doXXX().when(),推荐
- when().doXXX(),不推荐(当调用真实方法时,会先直接when中的方法,这时的真实方法可能有问题,例如没有实现而报错)
- any():可能造成 NPX
doReturn("first","second","third").when(list).get(anyInt());
doThrow(new RuntimeException(),new IllegalAccessError()).when(list).set(anyInt(),anyInt())
doCallRealMethod().when(list).get(0);
doNothing().when(list).add(anyInt());
doAnswer(invocation -> 11).when(list).get(1);
assert 11 == (int)list.get(1);
assert list.get(2) == null;
3 verify
3.1 验证 mock/spy 对象已经执行了什么行为
verify(list).add("one");
verify(list).clear();
3.2 验证行为执行的次数
verify(list).add("once"