加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 获取模拟的调用次数

发布时间:2020-12-15 02:58:29 所属栏目:Java 来源:网络整理
导读:假设我想测试这样的代码: class ClassToTest // UsedClass1 contains a method UsedClass2 thisMethod() {} UsedClass1 foo; void aMethod() { int max = new Random().nextInt(100); for(i = 0; i max; i++) { foo.thisMethod().thatMethod(); } }} 如果我
假设我想测试这样的代码:
class ClassToTest
  // UsedClass1 contains a method UsedClass2 thisMethod() {}
  UsedClass1 foo;
  void aMethod()
  {
    int max = new Random().nextInt(100);
    for(i = 0; i < max; i++)
    {
      foo.thisMethod().thatMethod();
    }
  }
}

如果我有这样的测试:

ClassToTest test;
UsedClass1 uc1;
UsedClass2 uc2;
@Test
public void thingToTest() {
  test = new ClassToTest();
  uc1 = mock(UsedClass1.class);
  uc2 = mock(UsedClass2.class);
  when(uc1.thisMethod()).thenReturn(uc2);
  when(uc2.thatMethod()).thenReturn(true);

  test.aMethod();

  // I would like to do this
  verifyEquals(callsTo(uc1.thisMethod()),callsTo(uc2.thatMethod()));
}

我如何获得对uc1.thisMethod()和uc2.thatMethod()的调用次数,以便我可以检查它们被调用的次数相同?

解决方法

您可以使用自定义VerificationMode来计算调用次数,您可以:
public class InvocationCounter {

    public static <T> T countInvocations(T mock,AtomicInteger count) {
        return Mockito.verify(mock,new Counter(count));
    }

    private InvocationCounter(){}

    private static class Counter implements VerificationInOrderMode,VerificationMode {
        private final AtomicInteger count;

        private Counter(AtomicInteger count) {
            this.count = count;
        }

        public void verify(VerificationData data) {
            count.set(data.getAllInvocations().size());
        }

        public void verifyInOrder(VerificationDataInOrder data) {
            count.set(data.getAllInvocations().size());
        }

        @Override
        public VerificationMode description(String description) {
            return VerificationModeFactory.description(this,description);
        }

    }

}

然后像这样使用它(也适用于void返回类型):

@Mock
private Function<String,Integer> callable;

AtomicInteger count= new AtomicInteger(); //here is the actual invocation count stored

countInvocations(callable,count).apply( anyString());

assertThat(count.get(),is(2));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读