在测试类中使用可访问的私有字段运行测试

时间:2016-02-05 09:24:35

标签: java unit-testing reflection

我有一些不断测试的课程:

public class SomeClass {
     private static final String SOME_CONST = "blabla";

我必须在测试中使用它,所以我(使用Spring ReflectionUtils和java.lang本机武器库)就像:

findField(SomeClass.class, "SOME_CONST").setAccessible(true);

makeAccessible(findField(SomeClass.class, "SOME_CONST"));

运行测试

@Test
public void someTest() throws Exception {
    String s = SomeClass.SOME_CONST; 

我看到我的Intellij Idea停止运行时出现与尝试访问私有字段相关的错误。假设我应该使用某种@SuppressWarnings或如何更好地解决这个问题?

2 个答案:

答案 0 :(得分:1)

测试私有方法/字段通常是糟糕设计的标志。 如果您不介意展示它,请将其设置为公开或放置一个getter来检索该变量,因为它是最终的,除非它有敏感数据或它是可变的,否则不应该有任何麻烦class(不是String的情况)。 或者使用您的方法,

Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
String someConst = (String) field.get(new SomeClass());

关注this hint

答案 1 :(得分:0)

如上所述,我们可以(或者甚至应该)将测试类的private字段更改为public,但如果您无法这样做,您可以使用我的zlution(我试过避免测试类中的额外字段,但没有人建议解决我的问题):

private String EXTRA_FIELD_TO_HOLD_CONSTANT_VALUE_FROM_TESTED_CLASS;

@Before
public void setUp() throws Exception { 
    EXTRA_FIELD_TO_HOLD_CONSTANT_VALUE_FROM_TESTED_CLASS = 
        getPrivateStringConstantValue("SOME_CONST");
}

private String getPrivateStringConstantValue(String fieldName) throws IllegalAccessException {
    Field field = findField(CtcFraudIPAddressListServiceImpl.class, fieldName);
    field.setAccessible(true);
    return field.get(testedService).toString();
}