如何在同一方法中模拟第二个对象?

时间:2016-12-26 12:34:00

标签: java unit-testing junit mocking mockito

现在我有一种方法可以使用Mockito进行测试。然而,该方法有点复杂。在同一个方法中,我需要新的两个对象都是相同的类型。

Timestamp beginTimestamp = new Timestamp(Long.parseLong(beginTimeLong));
Timestamp endTimestamp = new Timestamp(System.currentTimeMillis());

我想模仿第二个对象endTimestamp来抛出Exception,但我无法避免beginTimestamp的影响。现在我的问题是如何模拟第二个对象endTimeStamp,并在我调用endTimestamp's某个方法时抛出异常,例如:

endTimestamp.getTime()

我试着写下我的测试代码,如下所示,

@Ignore
public void getSynPotentialShopBeginTimeAndEndTest4() throws Exception {
    Timestamp beginTimestamp = PowerMockito.mock(Timestamp.class);
    Timestamp endTimestamp = PowerMockito.mock(Timestamp.class);
    PowerMockito.whenNew(Timestamp.class).withAnyArguments().thenReturn(beginTimestamp).thenReturn(endTimestamp);

    when(endTimestamp.getTime()).thenThrow(RuntimeException.class);
    redisService.getSynPotentialShopBeginTimeAndEnd();
}

它也不起作用。这些代码没有任何红色波浪下划线,但是当我试图运行它时,我得到了这样的例外:

 org.mockito.exceptions.base.MockitoException: 
    Incorrect use of API detected here:


You probably stored a reference to `OngoingStubbing` returned by `when()` and called stubbing methods like `thenReturn()` on this reference more than once.
Examples of correct usage:
    when(mock.isOk()).thenReturn(true).thenReturn(false).thenThrow(exception);
    when(mock.isOk()).thenReturn(true, false).thenThrow(exception);

我可以解决问题吗?无论如何,只有问题要解决,那就没问题。

1 个答案:

答案 0 :(得分:2)

试试这个

 PowerMockito.whenNew(Timestamp.class).withAnyArguments().thenReturn(beginTimestamp,endTimestamp);

而不是PowerMockito.whenNew(Timestamp.class).withAnyArguments().thenReturn(beginTimestamp).thenReturn(endTimestamp);