【问题标题】:Java unit tests set Manifest propertyJava 单元测试设置 Manifest 属性
【发布时间】:2014-08-16 03:36:21
【问题描述】:

有没有办法在测试时将属性注入 Java Manifest(或注入整个清单)?

我们正在从清单(版本号)中读取一个值,该值在测试时解析为 null。

到目前为止,我们已经尝试将硬编码的 MANIFEST.MF 文件放在我们的测试根目录中,但没有成功。

这是我们用来读取清单的代码:

private Attributes getManifest() {
    URLClassLoader cl = (URLClassLoader) getClass().getClassLoader();
    Manifest manifest;
    try {
        URL url = cl.findResource("META-INF/MANIFEST.MF");
        manifest = new Manifest(url.openStream());
    } catch (IOException e) {
        throw Throwables.propagate(e);
    }
    return manifest.getMainAttributes();
}

作为最后的手段,我们将包装读取清单并模拟它的功能,但这些是集成测试,应该是黑盒(即,我们正在避免模拟)。

额外信息:Java 7,在 IntelliJ 或 Gradle 中运行 Junit 测试。

【问题讨论】:

  • 那么,当你运行一个测试时,MANIFEST.MF 到底在哪里?
  • 当测试是一个独立的 java 应用程序而不是在容器中运行的应用程序时,为什么要在运行测试(可能是 JUnit?)时修改 java 清单?

标签: java junit manifest.mf


【解决方案1】:

您可能想试试 jcabi-manifests 库:http://manifests.jcabi.com/。它是 Java 清单工具的抽象,允许您在运行时附加新数据甚至组合多个清单。

典型的用法是访问Manifests.DEFAULT 单例,它在运行时保存应用程序的 MANIFEST.MF 条目。可以附加到这个对象:

Manifests.DEFAULT.put("Test-Property", "Hello");

ManifestsJavadoc:http://manifests.jcabi.com/apidocs-1.1/com/jcabi/manifests/Manifests.html

现在,每当您再次访问Manifests.DEFAULT 时,它都会有条目“Test-Property”。注意Manifest.DEFAULT 实现了Map 接口:

System.out.println(Manifests.DEFAULT.get("Test-Property")) // Prints "Hello"

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2017-10-30
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多