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

标签 java object methods mockito callstack

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

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

最佳答案

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

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

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

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

 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);

关于java - Mockito - 当主类包含许多其他类时模拟的深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478184/

相关文章:

java - 在java中使用Scanner读取空格分隔的行

java - 为什么 Object.hashCode() 不遵循 Java 代码约定

java - 使用 struts 2 表单标签编辑对象的 ArrayList

javascript - 根据值过滤对象数组

类中的Python调用方法

c# - 当我在方法中使用变量时,可以将变量调用为方法的参数吗?

java - JNI 和取消 AsyncTask

javascript - 通过循环创建具有值的深层对象

javascript - 访问单个 Json 对象中的元素

javascript - 如何在es6类中动态生成类方法名?