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