使用mockito验证通话之间的时间

时间:2017-11-29 11:42:59

标签: java unit-testing testing mockito doanswer

我已经阅读了很多文档,网上的例子,但仍然不知道如何去做。 (如果可以的话)。

我需要在其他线程调用的对象中测试一个方法,并且它需要时间。所以我最初的想法是创建一个间谍,覆盖方法并完成任务,但问题是,我无法从间谍访问测试方法变量。因此,我无法从测试方法中获取System.currentTimeMillis()返回的值,并且可以在一段时间内获取它以获得差异。

我将编写一些描述情况的抽象代码,以便您更好地了解情况。

@Test
public void test()
{
   Objectspied spy = Mockito.spy(new Objectspied(Parameters p));
   long[] timesRetrieved = new long[numberOfCallsIExpect];
   //here goes the tricky part
   Mockito.doAnswer(new Answer<void>(){
       @override
       public methodCalledFromAnotherThread(int index)
       {
          //what i wish to do but can't do it
          timesRetrieved[i] = System.currentTimeMilis();
       }
   }
   ).when(spy).methodCalledFromAnotherThread(anyInt);
   //here initialize the thread who call it
   //then proccess al time diferences and get sure they are what i've expected
}

public class AnotherThread 
{
   ObjectSpied reference;
   public void run()
   {
      for (int i=0;i<repeat;i++)
      {
         reference.methodCalledFromAnotherThread(i);
         Thread.sleep(1000);
      }
   }
}

我是Mockito的新手,所以我知道语法是完全错误的,但我可以自己修复,我需要知道的是:

  • 有没有办法和Mockito一起做?
  • 如果是的话,你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

你应该这样做好。请确保:

1)您将数组标记为最终

2)正确实施答案界面方法

    final long[] timesRetrieved = new long[size];
    Mockito.doAnswer(new Answer<Void>() {

        @Override
        public Void answer(InvocationOnMock invocationOnMock) throws Throwable {
            int index = invocationOnMock.getArgumentAt(0, Integer.class);
            timesRetrieved[index] = System.currentTimeMillis();;
            return null;  
        }
    }
    ).when(spy).methodCalledFromAnotherThread(Mockito.anyInt());