嗨,我有以下类(class)
public class DataAccessLayer<T> {
public T getData(Class<?> dataInfoType ,Integer id){
//Some logic here
}
}
public class ServiceLayer{
//this method has to be tested
public Integer testingMethode{
//The following line should be mocked
UtilClass info = new DataAccessLayer<UtilClass>().getData(UtilClass.class, 1);
retutn info.getSomeFieldWithIntegerValue();
}
}
我想为testingMethode编写测试用例,因为我需要模拟getData()
DataAccessLayer<T>
中的方法
jmockit
可以吗?模拟模板(通用)类?
最佳答案
(我只能回答 Mockito,因为这是我最熟悉的;但同样的原则应该适用于其他模拟框架)。
首先,您需要能够注入(inject) DataAccessLayer<UtilClass>
进入ServiceLayer
,例如
class ServiceLayer {
private final DataAccessLayer<UtilClass> dal;
ServiceLayer(DataAccessLayer<UtilClass> dal) {
this.dal = dal;
}
public Integer testingMethode() {
UtilClass info = dal.getData(UtilClass.class, 1);
return info.getSomeFieldWithIntegerValue();
}
}
这打破了与 DataAccessLayer<UtilClass>
的静态耦合通过使用 new
创建.
现在,您可以创建 DataAccessLayer<UtilClass>
的模拟实例通过创建一个非泛型子类:
class UtilClassDataAccessLayer extends DataAccessLayer<UtilClass> {}
然后创建一个模拟实例:
DataAccessLayer<UtilClass> mocked = mock(UtilClassDataAccessLayer.class);
现在,您可以根据需要配置此模拟,并将其传递到 ServiceLayer
:
ServiceLayer serviceLayer = new ServiceLayer(mocked);
关于Java 模拟 : How to Mock a generic class method in JMockit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36196939/