0

新的模仿。我仍在尝试了解这是如何工作的。

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

  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. 如果我 mock ,Bank它会自动 mockAccount吗?CustomerAccTypes
  2. 如何测试该deposit()方法?(它最终必须到达getAccountTypesAccTypes(请提供代码,并附上解释)。

请注意,它非常简单(实际上是伪代码)。所以可能不是一个完美的java代码。但这只是为了让您了解我想要实现的目标。

4

2 回答 2

4

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

要对方法的行为进行单元测试,deposit()您将为Customer. 唯一的依赖是Account让我们模拟它:

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

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

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

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

 customer.deposit(100, Type.SOME_TYPE);

现在验证该方法的行为。我们期望它调用getLimits()withType.SOME_TYPE而不是别的:

 // 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);
于 2013-07-04T21:37:23.620 回答
0

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

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

例如

@Mock
private Bank bankMock;

when(bankMock.getAccount().thenReturn(mock(Account.class));
于 2013-07-04T21:33:49.443 回答