我想在模拟时以不同的方式初始化一个类的静态最终变量,而当它不是模拟时。有没有办法做到这一点?
就像是 :
public class Test {
private static final Integer a = getA();
private static Integer getA() {
if(mocked) {
return x;
} else {
return y;
}
}
我想在模拟时以不同的方式初始化一个类的静态最终变量,而当它不是模拟时。有没有办法做到这一点?
就像是 :
public class Test {
private static final Integer a = getA();
private static Integer getA() {
if(mocked) {
return x;
} else {
return y;
}
}
我认为这是一个坏主意(因为您不应该检查您的实例是否被模拟,我认为这会破坏模拟的目的),但是您当前的方法看起来几乎是正确的。我假设您想指定getA()
返回int
。
private static int getA() {
}
当然,您的方法本身似乎毫无意义 - 在这种情况下,您可以使用条件运算符? :
,例如
private static final Integer a = mocked ? x : y;
这就是为什么静态不利于单元测试的原因。最好的解决方案是将静态转换为实例方法,然后添加一些间接方法,以便您的单元测试可以模拟/实现/覆盖该方法。唯一的其他选择是使用反射来强制覆盖单元测试中的值,这显然更脆弱(并且不利于在同一进程/类加载器中运行许多单元测试)。