【问题标题】:How to mock the second object in the same method?如何以相同的方法模拟第二个对象?
【发布时间】:2016-12-26 12:34:00
【问题描述】:

现在我有了一种使用 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);

还有其他解决方案可以解决问题吗?反正只要解决了问题就好了。

【问题讨论】:

    标签: java unit-testing junit mocking mockito


    【解决方案1】:

    试试这个

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多