我们都知道可以用如下方法Mock一个方法的调用并返回我们需要的值。
when(function(any())).thenReturn(null)
但是如果遇到如下的级联调用的方法怎么办呢?
suffix = redis.opsForValue().increment(prefix, 1L);
这时候我们可以先Mock出一个 redis.opsForValue() 返回的对象,如下:
@Mock
ValueOperations<String, String> valueOperations;
然后可以在设置方法里面将这个对象作为 redis.opsForValue() 的返回。因为 redis 在多个方法里面都会使用到,所以我放在了 @Before 注解的方法里,当然直接放在测试方法里也是可以的。
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(redis.opsForValue()).thenReturn(valueOperations);
}
接下来的事情就简单了,我们可以在测试方法里直接操纵这个对象来 mock 我们需要的方法,如下:
when(valueOperations.increment(anyString(), anyLong())).thenReturn(10000L);
其实就是要懂得利用 JUnit 进行测试的本质就是不断创造出我们测试所需要的东西。