![](/img/trans.png)
[英]Mocking an abstract class and injecting classes with Mockito annotations?
[英]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;
}
}
Bank
,它会自动模拟Account
, Customer
和AccTypes
吗? 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。如果使用任何其他参数调用它,则将返回默认值( 0
, false
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.