我已经阅读了很多文档,网上的示例,但仍然不知道如何做。(如果可以完成)。
我需要在其他线程调用的对象中测试一种方法,并且需要时间。因此,我最初的想法是创建间谍,覆盖方法并执行任务,但是问题是,我无法从间谍中访问测试方法变量。因此,我无法从测试方法中从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)您将数组标记为最终
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());