我有一些不断测试的课程:
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
或如何更好地解决这个问题?
答案 0 :(得分:1)
测试私有方法/字段通常是糟糕设计的标志。 如果您不介意展示它,请将其设置为公开或放置一个getter来检索该变量,因为它是最终的,除非它有敏感数据或它是可变的,否则不应该有任何麻烦class(不是String的情况)。 或者使用您的方法,
Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
String someConst = (String) field.get(new SomeClass());
答案 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();
}