Java 模拟 : How to Mock a generic class method in JMockit

标签 java unit-testing generics junit jmockit

嗨,我有以下类(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/

相关文章:

java - Android findViewById 找不到资源

ruby - 如何在 Ruby 中为多个环境创建配置文件?

ruby-on-rails - rspec 测试方法的输入是否具有特定结构

java - 带有 Kotlin 的 Dagger 2,在 ApplicationComponent 中返回具有泛型的类型

java - 如何在子类型上使用为通用父类(super class)型声明的 Guava 函数?

c# - 是否可以更改 Func<T, bool> 委托(delegate)的泛型类型参数?

java - Php 与 Java 数据库字符串比较

Java双参数递归

java - 如何确定 Vaadin 8 中 UI 中的组件是否已更新

unit-testing - 删除错误的播放列表以在 Visual Studio 2012 中测试资源管理器