如果我有一个名为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);
答案 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();