调用mock函数时更新非模拟对象

时间:2017-03-14 14:30:39

标签: java unit-testing mocking mockito

如果我有一个名为quantity的非模拟对象(具有更新函数)和另一个名为m的模拟,我如何更新数量对象,然后在调用m.doSomething()时返回它。 我想做这样的事情。

Quantity quantity = new Quantity(1);
M m = //...another object
when(m.doSomething()).thenReturn(quantity.update(2));

但我不能这样做因为update()无效。有没有办法可以调用数量更新,然后返回更新的数量?

我在考虑这样的事情

when(m.doSomething()).thenDo(quantity.update(2)).thenReturn(quantity);

2 个答案:

答案 0 :(得分:1)

  

想象一下,数量也是一个模拟,当我调用m.doSomething时,我想触发quantity.update()。

我认为你想要的是这样的:

class QuantityTest{

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    @Mock
    private Quantity quantity;
    @Mock
    private M m;

    Cut cut;
    @Before
    public void setup(){
      cut = new Cut(m,quantity);
   }

   @Test getsQuantitiesAsDesired(){
     doReturn(1,2).when(quantity).get(); //return 1 at first call, 2 at all others
     InOrder inOrder = inOrder(m,quantity);

     cut.doSomethingWithQuantityAndM();

     inOrder.verify(quantity).get();
     inOrder.verify(m).doSomething();
     inOrder.verify(quantity).get();
   }
}

但如果你坚持改变Quantity

class QuantityTest{

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();   
    @Mock
    private M m;    

    private Quantity quantity = new Quantity(1);
    Cut cut;
    @Before
    public void setup(){
      cut = new Cut(m,quantity);
   }

   @Test getsQuantitiesAsDesired(){
    doAnswer(i->quantity.update(2)).when(m).doSomething();
    // ...

我没有对它进行测试,因此您可能需要无效答案的“匿名类”表单...

答案 1 :(得分:0)

以下内容应该是您所寻找的:

doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable{
        quantity.update(2);
        return quantity;
    }
}).when(m).doSomething();