我正在努力将我们的旧版构建从使用Ant转换为Maven(如果有问题的话,请参见3.3.3),然后遇到了麻烦。我们的代码库有一个类,用于从系统属性初始化私有静态字段,该属性通常由应用程序调用时的启动脚本填充。执行此代码的单元测试在执行测试之前设置系统属性。在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的静态块中),并确定在Eclipse或Ant中运行时,该类是在testGetValueField方法执行期间加载的,而在Maven中,该类是加载的在执行setupBeforeClasses方法之前的某个时间。这将导致使用来自“ target.value”系统属性的空值初始化SAMPLE_FIELD。
任何帮助是极大的赞赏!抢
如果您可以从设置系统属性pom.xml
,则请停止从@BeforeClass
方法中进行操作,然后尝试以下操作:
<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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句