无法读取静态块中的系统属性



我在设置JUnit测试中servlet中定义的系统属性时遇到了一个问题。我的servlet初始化如下所示:

public class MyServlet extends HttpServlet
{
private static final long serialVersionUID = 4306648703337839989L;
private static final String CLASS_NAME = MyServlet.class.getName();
public static final String PROPERTY_NAME = CLASS_NAME + ".myProperty";
private static final long DEFAULT_PROPERTY_VALUE = 120000;
private static final long PROPERTY_VALUE;
static
{
long propValue = DEFAULT_PROPERTY_VALUE;
final String propertyStr = java.lang.System.getProperty(PROPERTY_NAME);
if (propertyStr != null)
{
propValue = Long.parseLong(propertyStr);
}
PROPERTY_VALUE = propValue;
}
}

现在,我的JUnit测试将属性值设置为5000,如下所示:

@Test
public void testMyServlet()
{
java.lang.System.setProperty(MyServlet.PROPERTY_NAME, "5000");
<test>
}

当我运行测试时,静态最终字段"PROPERTY_value"的值被解析为120000,而不是5000。很明显,servlet初始化发生在测试之前,这就是为什么在测试可以设置系统属性之前,字段的值已经被解析为默认值的原因。我正在寻找绕过这一问题的建议,以便我的测试可以将系统属性设置为5000。

谢谢!

EDIT:解决方案

我可以通过两种方式将系统属性设置为5000来进行测试:

解决方案1:在测试类最顶部的静态块中设置系统属性。

public class MyTest
{
static
{
java.lang.System.setProperty("com.servlets.MyServlet.myProperty", "5000");
}
@Test
public void testMyServlet()
{
<my test>
}
}

解决方案2:在JUnit测试本身中设置系统属性,但使用属性键作为完整的规范名称。

public class MyTest
{
@Test
public void testMyServlet()
{
java.lang.System.setProperty("com.servlets.MyServlet.myProperty", "5000");
<my test>
}
}

我通过两种方式将系统属性设置为5000,从而使测试正常进行:

解决方案1:在测试类最顶部的静态块中设置系统属性。

public class MyTest
{
static
{
java.lang.System.setProperty("com.servlets.MyServlet.myProperty", "5000");
}
@Test
public void testMyServlet()
{
<my test>
}
}

解决方案2:在JUnit测试本身中设置系统属性,但使用属性键作为完整的规范名称。

public class MyTest
{
@Test
public void testMyServlet()
{
java.lang.System.setProperty("com.servlets.MyServlet.myProperty", "5000");
<my test>
}
}

最新更新