在测试时是否有办法将属性注入(inject)Java list (或注入(inject)整个 list )?

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

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

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

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();
}

作为最后的手段,我们将包装读取 list 并对其进行模拟的功能,但这是集成测试,应该被认为是黑盒(即,我们避免了模拟)。

附加信息:Java 7,在IntelliJ中或从Gradle中运行Junit测试。

最佳答案

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

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

Manifests.DEFAULT.put("Test-Property", "Hello");
Manifests Javadoc:http://manifests.jcabi.com/apidocs-1.1/com/jcabi/manifests/Manifests.html

现在,每当您再次访问Manifests.DEFAULT时,它将具有条目“Test-Property”。请注意,Manifest.DEFAULT实现了Map接口(interface):
System.out.println(Manifests.DEFAULT.get("Test-Property")) // Prints "Hello"

09-10 20:44