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;
}
}
- 如果我 mock
Bank
,它会自动模拟Account
,Customer
和AccTypes
还有吗? - 如何测试
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。如果使用任何其他参数调用,则会返回默认值(0
、false
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/