当一个方法调用另一个方法时,如何让Mockito执行返回?

时间:2016-07-11 04:55:53

标签: java mockito

我正在使用Mockito进行集成测试,并且我在发生超时时测试了这个场景。

public boolean checkTimeout(){
  if (createdAt.isBefore(dateTimeHelper.getNowUtc().minus(PROCESSING_TIMEOUT_MILLIS))) {
      return true;
  }
  return false;
}

在集成测试中,dateTimeHelper.getNowUtc()方法被调用10次以上。而且我只想模仿当前调用checkTimeout()函数的时间,并模拟另一个时间作为存根时间,比如说2015-11-2 15:20:45&# 39;

有谁能告诉我嘲笑这个的正确方法是什么?

蛮力方式

doReturn(new DateTime(2015, 11, 2, 15, 30, 45)).doReturn(new DateTime(2015, 11, 2, 15, 30, 45)).......
        .doCallRealMethod().when(dateTimeHelperMock).getNowUtc();

doReturn() 10次以上,然后doCallRealMethod()写丑。如果有人触摸代码并添加更多getNowUtc(),则测试将失败。

我是Mockito的新手,所以想知道在getNowUtc()

中调用checkTimeout()时是否可以控制模拟

1 个答案:

答案 0 :(得分:1)

你可以做这样的事情:

    Mockito.when(obj.get()).thenAnswer(new Answer<String>() {
        public String answer(InvocationOnMock invocation) throws Throwable
        {
            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
            for (StackTraceElement element : stackTrace)
            {
                //logic to iterate over stack trace elemtns and find your method.
            }
        }

    });