【问题标题】:Creating integration tests on classes with dependency injection使用依赖注入在类上创建集成测试
【发布时间】:2018-01-11 08:39:00
【问题描述】:

我有一个严重依赖依赖注入的 Java EE Web 应用程序。

目前它按预期工作,它在生产中以我想要的方式注入所有东西,当我编写单元测试时,我可以毫不费力地注入模拟对象。

但是我现在想创建集成测试,以便我知道整个流程正在运行,并且它正在从其他 API 获取和解析正确的数据。

我现在看到的问题是在测试环境中解决依赖注入,因为它是一个集成测试,需要解决更多的依赖,所以手动这样做似乎不可行。

那么,这通常是如何解决的?作为参考,我混合使用@EJB@Inject 注入Objects

【问题讨论】:

  • 为什么您在测试环境中遇到依赖注入问题?它应该与您的生产环境本质上是相同的环境,除了使用更少的数据并为各种目的模拟一些外部服务。
  • 我可能不清楚,测试环境是指运行测试,而不是部署到单独的环境。因此,如果我“实际运行”应用程序,我不会得到本来可以解决的注入
  • 测试环境并不一定意味着您将部署到一个单独的物理环境。

标签: java testing dependency-injection integration-testing


【解决方案1】:

在我弄清楚“应该”如何完成之前,我将使用一个肮脏的 hack 解决方法:

    private static Map<Class, Object> instances = new HashMap<>();
    public static <T> T getInstance(Class<T> type) throws IllegalAccessException, InstantiationException {
        if(instances.containsKey(type))
            return (T)instances.get(type);
        T res = type.newInstance();
        instances.put(type, res);
        for(Field field : type.getDeclaredFields()) {
            if (field.isAnnotationPresent(Inject.class) || field.isAnnotationPresent(EJB.class)) {
                field.setAccessible(true);
                field.set(res, getInstance(field.getType()));
            }
        }
        return res;
    }

【讨论】:

  • 您自己注射吗?如果有,为什么?
  • 在这种情况下是的,因为在我运行测试时不会触发正常的注入处理。
  • 你的测试框架应该处理注入,而不是你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2013-12-25
相关资源
最近更新 更多