繁体   English   中英

Mockito-当主类包含许多其他类时的模拟深度?

[英]Mockito - Depth of the mocking when main class contains lot of other classes?

Mockito的新手。 我仍在尝试了解其工作原理。

例如,如果我模拟一个类,它会自动模拟该类中的所有类吗?

  class Bank {
     Customer cust;
     cust.deposit(102, CHECK);
  }

  class Customer {
     Account acct;
     public deposit(int amount, Type t) {
         return account.getLimits( t );
     }
  }

  class Account {
    AccTypes types;
    public getLimits(Type t)  {
      int res =  types.getAccountType(t);
      return res;
    }
  }

  class AccTypes {
    pulic getACcountTypes( Type t){
       return something;
    }
  }
  1. 如果我模拟Bank ,它会自动模拟AccountCustomerAccTypes吗?
  2. 如何测试deposit()方法? (它最终必须达到AccTypes getAccountTypes )(请提供代码,并附有说明)。

请注意,它非常简单(实际上是伪代码)。 因此可能不是完美的Java代码。 但这只是让您了解我正在努力实现的目标。

模拟只会实现与您模拟的类或接口相同的非私有方法。 即使您模拟的类具有引用,它也不会包含对您对象的其他任何对象的引用。

要对deposit()方法的行为进行单元测试,您将为Customer所有依赖关系创建一个模拟。 唯一的依赖关系是Account所以让我们来模拟一下:

 Account accMock = Mockito.mock(Account.class);
 Mockito.when(accMock.getLimits(Type.SOME_TYPE)).thenReturn(500);

现在,只要accMock.getLimits()Type.SOME_TYPE调用accMock.getLimits() ,它将返回500。如果使用任何其他参数调用它,则将返回默认值( 0false null ,具体取决于返回类型)。 接下来,我们创建要测试的对象,并将account字段设置为我们的模拟:

 Customer customer = new Customer();
 customer.setAccount(accMock);

调用要测试的方法,即deposit()

 customer.deposit(100, Type.SOME_TYPE);

现在,验证该方法的行为。 我们期望它使用Type.SOME_TYPE调用getLimits() ,而不会执行其他任何操作:

 // verify that getLimits() is invoked for Type.SOME_TYPE
 Mocktio.verify(accMock).getLimits(Type.SOME_TYPE);
 // verify that no other method is called on accMock
 Mockito.verifyNoMoreInteractions(accMock);

我可能会误解您的问题,但是当您使用Mockito模拟Bank并称其为模拟时,您不再调用Bank类中的实现逻辑,因此Mockito没有理由嘲笑那些依赖类。

如果希望将模拟类从调用返回到Bank,则可以将Bank模拟设置为返回指定调用所需的内容,否则无需为其他类创建模拟。

例如

@Mock
private Bank bankMock;

when(bankMock.getAccount().thenReturn(mock(Account.class));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM