概述
整理Mockito结合ArgumentCaptor捕获多次调用的方法的参数
今天在对业务代码进行开发时,发现需要捕获多次调用的方法的参数,验证参数传递的正确性,这里对获取方法进行总结。
首先,模拟一个简单的测试场景,有一个对外提供服务的类:
@Component
public class CaptorLearning {
private DalService dalService;
@Autowired
public CaptorLearning(DalService dalService) {
this.dalService = dalService;
}
public int getResult(int num1, int num2, int num3) {
int result1 = dalService.doHandle(num1, num2);
int result2 = dalService.doHandle(num1, num3);
return result1 + result2;
}
}
有一个内部的业务处理类:
@Component
public class DalService {
public int doHandle(int num1, int num2) {
return num1 + num2;
}
}
这里要对CaptorLearning进行单元测试覆盖,因此需要判断dalService两次调用了doHandle方法,并获取相应的参数,判断是否参数调用正确。
首先是两次调用,可以利用Mockito
提供的verify
方法,来判断调用次数,代码如下:
@Test
public void testByVerify() {
captorLearning.getResult(num1, num2, num3);
Mockito.verify(dalService, times(2)).doHandle(Mockito.anyInt(), Mockito.anyInt());
}
如果此时,要判断两次调用doHandle
方法的参数,可以利用ArgumentCaptor
的capture
方法进行模拟,再通过getAllValues
方法来获取所有的参数值,代码如下:
@Test
public void testWithArgumentCaptor() {
captorLearning.getResult(num1, num2, num3);
ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
Mockito.verify(dalService, times(2)).doHandle(Mockito.anyInt(), integerArgumentCaptor.capture());
// 拿到ArgumentCaptor捕获的参数List,通过下标,按照调用时机,依次取出
List<Integer> list = integerArgumentCaptor.getAllValues();
Assert.assertEquals(num2, list.get(0).intValue());
Assert.assertEquals(num3, list.get(1).intValue());
}
有时候可能我们捕获的虽然是方法调用的同一个参数,但有可能参数类型会不同,例如还是上面的场景,两个类都新增了方法:
@Component
public class DalService {
public int doHandle(int num1, int num2) {
return num1 + num2;
}
public <T> void doHandle(T data1, T data2, T data3, Class<T> clazz) {
// doing ...
}
}
@Component
public class CaptorLearning {
private DalService dalService;
@Autowired
public CaptorLearning(DalService dalService) {
this.dalService = dalService;
}
public int getResult(int num1, int num2, int num3) {
int result1 = dalService.doHandle(num1, num2);
int result2 = dalService.doHandle(num1, num3);
return result1 + result2;
}
public void getResult(int num1, int num2, int num3, String string1, String string2, String string3) {
dalService.doHandle(num1, num2, num3, Integer.class);
dalService.doHandle(string1, string2, string3, String.class);
}
}
这时候如果还是使用上面的测试方式,则会报错,因为String类型没办法转成Integer类型。
这里一种简单的解决办法,就是创建两个ArgumentCaptor,分别进行获取,再根据特定的下标,来获取某次调用时的捕获的参数,代码如下:
@Test
public void testWithTwoArgumentCaptor() {
captorLearning.getResult(num1, num2, num3, string1, string2, string3);
// 参数捕获器1,用于捕获参数类型为Integer类型的参数
ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
Mockito.verify(dalService, times(2)).doHandle(integerArgumentCaptor.capture(), any(), any(), any());
// 第一次调用时,参数类型为Integer类型,取出值进行校验
Assert.assertEquals(num1, integerArgumentCaptor.getAllValues().get(0).intValue());
// 参数捕获器2,用于捕获参数类型为String类型的参数
ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.verify(dalService, times(2)).doHandle(stringArgumentCaptor.capture(), any(), any(), any());
// 第二次调用时,参数类型为String类型,取出值进行校验
Assert.assertEquals(string1, stringArgumentCaptor.getAllValues().get(1));
}
总结:
利用ArgumentCaptor
的capture
方法进行mock,再通过getAllValues
方法,可以捕获多次调用的方法的参数。
最后
以上就是可耐毛巾为你收集整理的【Java】Mockito捕获多次调用的方法的参数的全部内容,希望文章能够帮你解决【Java】Mockito捕获多次调用的方法的参数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复