java - 使用系统属性和静态字段迁移到 Maven 时,JUnit 类加载器出现问题

标签 java maven junit classloader

我正在努力将我们的旧版本从使用 Ant 转换为 Maven(3.3.3,如果这很重要),但遇到了障碍。我们的代码库有一个类,它从系统属性初始化私有(private)静态字段,该字段通常由应用程序调用时的启动脚本填充。执行此代码的单元测试是在执行测试之前设置系统属性。在 Ant 中或通过 Eclipse JUnit 运行程序运行单元测试时,一切正常。通过maven运行时,似乎在单元测试执行之前静态字段被初始化,导致属性不存在,并且测试失败。

我已经整理了一个示例类和单元测试来进行演示,因为我不允许在此处发布实际代码。

package foo.bar;

public class ValueClass { 
    private static final String SAMPLE_FIELD = "Foo " + System.getProperty("target.value");

    private final myValueField;

    public ValueClass() {
        myValueField = "random text " + SAMPLE_FIELD;
    }

    public String getValueField() { 
        return myValueField;
    }
}

以及相应的单元测试:

package foo.bar;

import org.junit.Test;
import org.junit.BeforeClass;

public class ValueClassTest { 

    @BeforeClass
    public static void setupBeforeClasses() { 
        System.setProperty("target.value", "value from test");
    }

    @Test
    public void testGetValueField() { 
        String expected = "random text Foo value from test";

        ValuesClass valuesClassInstance = new ValuesClass();

        String actual = valuesClassInstance.getValueField();

        assertEquals(expected, actual);
    }  
}

正如我提到的,当我使用 Ant 或 Eclipse 执行时,一切正常。我尝试过一些日志记录(将一些日志消息放入 ValueClass 中的静态 block 中),并确定在 Eclipse 或 Ant 中运行时,会在 testGetValueField 方法执行期间加载该类,而在 Maven 中,会加载该类在执行 setupBeforeClasses 方法之前的某个时间。这会导致 SAMPLE_FIELD 使用“target.value”系统属性中的空值进行初始化。

非常感谢任何帮助! 罗布

最佳答案

如果您可以从 pom.xml 设置系统属性,则停止从 @BeforeClass 方法执行此操作,并且 try this :

<project>
        [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
        <configuration>
          <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <buildDirectory>${project.build.directory}</buildDirectory>
            [...]
          </systemPropertyVariables>
        </configuration>
      </plugin>
    </plugins>
  </build>
        [...]
</project>

关于java - 使用系统属性和静态字段迁移到 Maven 时,JUnit 类加载器出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37466934/

相关文章:

java - 如何修复 Maven 和 Jacoco 的特定版本问题?

java - JDK 的第一个版本是如何进行单元测试的?

java - 如何在@WebMvcTest测试中忽略@EnableWebSecurity注释的类

Java GUI - 读取文本文件,其中文本文件的每一行都是它自己的字符串

java - 尽管存在绑定(bind)依赖性,但无法加载 StaticLoggerBinder

maven - 通过 maven 将 ActionBar Sherlock 与 intellij 结合使用。 AndroidManifest.xml 中的 @style/Theme.Sherlock 不匹配

eclipse - Groovy Eclipse 无法启动 junit 测试

java - 如何为 IOException 编写 junit 测试用例

java - 将 java 进程锁定或固定到内存中

java - JAAS和Web服务授权: get logged user