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

标签 java unit-testing mocking mockito

如果我有一个名为 amount 的非模拟对象(具有更新功能),以及另一个名为 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);

最佳答案

Imagine that quantity is a mock as well, and when I call m.doSomething, I want to then trigger 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();
   }
}

但是如果您坚持更改数量:

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();
    // ...

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

关于java - 调用模拟函数时更新非模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788756/

相关文章:

tdd - NMock2.0 - 如何 stub 非接口(interface)调用?

java - Camel onException - 具有相同异常类但不同操作的路由

java - 帮助 Netbeans 用户安装 Eclipse

java - 使用 Netty 的 Java 服务器端和 C++ 或 Objective C 的客户端

php - 在phpunit中, "with"方法内部是否有类似于onconsecutivecalls的方法?

c# - 如何验证调用了一个方法?

ruby-on-rails - Controller 测试渗入模型?

java - 无论构造函数签名如何,模拟类的属性

java - Java DB 程序上的“下一步”按钮

java - SpringJUnit4ClassRunner 应该初始化它的上下文多少次?