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

Java Mockito—当主类包含许多其他类时模拟的深度?,java,object,methods,mockito,callstack,Java,Object,Methods,Mockito,Callstack,莫基托的新朋友。我仍在努力理解这是如何工作的 例如,如果我模拟一个类,它会自动模拟该类中的所有类吗 class Bank { Customer cust; cust.deposit(102, CHECK); } class Customer { Account acct; public deposit(int amount, Type t) { return account.getLimits( t ); }

莫基托的新朋友。我仍在努力理解这是如何工作的

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

  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;
    }
  }
  • 如果我模拟
    银行
    ,它是否也会自动模拟
    账户
    客户
    账户类型
  • 如何测试
    deposit()
    方法?(它最终必须到达
    acktypes
    中的
    getAccountTypes
    ) (请输入代码并解释)

  • 请注意,这是一个非常简单的代码(实际上是伪代码)。因此,这可能不是一个完美的java代码。但这只是给你一个想法,我正在努力实现

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

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

    例如


    我可能误解了你的问题,但当你用Mockito模拟银行并调用said mock时,你不再调用银行类中的实现逻辑,因此Mockito没有理由模拟那些依赖类

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

    例如


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

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

     Account accMock = Mockito.mock(Account.class);
     Mockito.when(accMock.getLimits(Type.SOME_TYPE)).thenReturn(500);
    
    现在,只要有任何东西使用
    Type.SOME\u Type
    调用
    accMock.getLimits()
    ,它就会返回500。如果使用任何其他参数调用它,将返回默认值(
    0
    false
    null
    ,具体取决于返回类型)。 接下来,我们创建要测试的对象,并将account字段设置为我们的模拟:

     Customer customer = new Customer();
     customer.setAccount(accMock);
    
    调用要测试的方法,即
    deposit()

    现在验证方法的行为。我们希望它使用
    类型调用
    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);
    

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

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

     Account accMock = Mockito.mock(Account.class);
     Mockito.when(accMock.getLimits(Type.SOME_TYPE)).thenReturn(500);
    
    现在,只要有任何东西使用
    Type.SOME\u Type
    调用
    accMock.getLimits()
    ,它就会返回500。如果使用任何其他参数调用它,将返回默认值(
    0
    false
    null
    ,具体取决于返回类型)。 接下来,我们创建要测试的对象,并将account字段设置为我们的模拟:

     Customer customer = new Customer();
     customer.setAccount(accMock);
    
    调用要测试的方法,即
    deposit()

    现在验证方法的行为。我们希望它使用
    类型调用
    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);
    

    您没有显示足够的代码。“请输入代码”:pYour
    Bank
    示例不是有效的Java代码。我不明白为什么。这是一个简单的代码,可能不是真实的世界。但它足够简单,可以想象现实世界的场景。我知道缺少对象创建代码。但它让你知道我想做什么。Mockito不模拟类。它创建类的模拟实例。因此,如果您创建一个模拟银行实例,您将得到一个模拟银行,而不是一个模拟帐户。您没有显示足够的代码。“请输入代码”:pYour
    Bank
    示例不是有效的Java代码。我不明白为什么。这是一个简单的代码,可能不是真实的世界。但它足够简单,可以想象现实世界的场景。我知道缺少对象创建代码。但它让你知道我想做什么。Mockito不模拟类。它创建类的模拟实例。所以,如果您创建一个模拟银行实例,您将得到一个模拟银行,而不是一个模拟帐户。我要叫押金。所以我需要在打电话之前模拟客户,甚至在客户之前,我需要模拟账户,等等?如果问题不清楚,请道歉。@KevinRave不,我想你是糊涂了。如果我创建了一个模拟银行,那么我不再调用银行类中实际实现的任何功能,我只调用模拟。这个mock允许我控制对mock的任何调用都应该返回什么,以及验证和查看是否针对mock进行了某些调用。这里真正的问题是,你为什么要创建模拟银行,你想做什么?银行是我的Web服务类,存款是我的Web服务方法。它具有类似银行类(Account、Customer等)的依赖继承权,因此我使用mock(Bank.class)为银行创建了一个mock。我要叫押金。所以我需要在打电话之前模拟客户,甚至在客户之前,我需要模拟账户,等等?如果问题不清楚,请道歉。@KevinRave不,我想你是糊涂了。如果我创建了一个模拟银行,那么我不再调用银行类中实际实现的任何功能,我只调用模拟。这个mock允许我控制对mock的任何调用都应该返回什么,以及验证和查看是否针对mock进行了某些调用。这里真正的问题是,你为什么要创建模拟银行,你是什么