Shiba Togami
Shiba Togami

Reputation: 33

Verifiying time between calls with mockito

I've read a lot of documentation, examples on the net, and still have no idea of how to do it. (if it could be done).

I need to test a method in a object called by other thread and it has a requirement of time. So my original idea was creating a spy, override the method and do the task, but the problem is, I can't access test method variables from the spy. So I can't get the value returned from System.currentTimeMillis() from the test method and proccess it to get the difference within times.

I will write some abstract code describing the situation so you could understand better the situation.

@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);
      }
   }
}

I'm new to Mockito so i know syntax is totally wrong but i can fix that by myself, all i need to know is:

Upvotes: 2

Views: 588

Answers (1)

Maciej Kowalski
Maciej Kowalski

Reputation: 26522

You should be fine this way. Just make sure:

1) You mark the array as final

2) Properly implement the answer interface method

    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());

Upvotes: 1

Related Questions