2016-05-16 143 views
0

我有困难时间嘲笑类中私有静态最终字符串字段。这里是我的Java代码示例:使用Mockito模拟私有静态最终字符串

public class Fruit { 
private static final String FRUIT = "apple"; 

public void getFruit() { 
    System.out.println("I like " + FRUIT); 
} 

}

而且我用的Mockito嘲笑水果变量,这样我可以从“苹果”到“芒果”改变水果的价值。对于这里是我的测试:

public class FruitTest { 
@Test 
public void testFruit() throws NoSuchFieldException, SecurityException, Exception { 
    setFinalStatic(Fruit.class.getDeclaredField("FRUIT"), "mango"); 
    Fruit fruit = new Fruit(); 
    fruit.getFruit(); 
} 

static void setFinalStatic(Field field, Object newValue) throws Exception { 
    field.setAccessible(true); 
    Field modifiersField = Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 
    field.set(null, newValue); 
} 

}

当我做System.out.println("I like " + FRUIT); 我期待它会打印芒果,但它仍然是印刷苹果。我真的很感激,如果任何人都可以帮助我这个只有使用MOCKITO而不是PowerMock等

+2

'Fruit'类的行为将总是返回'apple'。因此,我认为你不应该改变这一点。如果你想要返回一个可变类型的水果,那么不要将字段设置为'static final',并使用'when()'来模拟你想要的行为。 –

回答

0

编译时常量可以由javac内联进行优化。如果你改变你的水果类的东西类似于:

public static class Fruit { public static final String FRUIT = getFruit();

public static String getFruit() { 
     return "apple"; 
    } 



} 

它会显示与 setFinalStatic结果芒果(Fruit.class.getField( “水果”), “芒果”); System.out.println(Fruit.FRUIT);

0

我最近调查了一些静态字段,我不认为你可以在没有powermock的帮助下做你想做的事情。我也不确定你为什么想要。一个私有静态final字段是一个常量,并且不应该有一个真正的原因,为什么你会想要一个常量改变。任何试图这样做的测试都是试图测试错误的东西。

0

更改常量的值不是一个好习惯。更重要的是,我认为这是不可能的。但是,如果您想更改字段的值,请删除修饰符“final”。

0

单词最终正好描述了一旦该字符串被创建后,您不应该更改该值。这是您在Java中获取常量的方式。你的getFruit方法将总是返回“apple”。 Mockito不会帮助你。如果你正在测试这个方法,你需要测试它总是返回“苹果”。在你的情况下,这个方法是静态的还是没有关系,因为你要返回的是一个常数值。使用反思并不是一个好主意,不仅仅因为它是一种非常糟糕的编程习惯,而且还因为你没有办法在将来适当地管理变化。这是一种侵入式代码,需要大量的维护,并且它总是会生成若干行,以便在运行时更改该方法以便“可以进行测试”。所有现实生活中的情况都不需要在单元测试中进行反思,除非有足够的理由,或者仅仅是架构需要改进。反思更多的是学术性的东西,或者如果你正在建立自己的注射系统,嘲弄工具或任何需要这种编码的东西。

相关问题