Java单元测试设置Manifest属性

And*_*w M 8 java junit manifest.mf

在测试时有没有办法将属性注入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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 2

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

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

Manifests.DEFAULT.put("Test-Property", "Hello");
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)