这是我第一次尝试使用反射进行单元测试,我有这个疑问。
Class Example {
public static Map<Something, Something> someMethod()
{
int temp = -1;
//Some implementation which might change the value of temp
//depending on other cases
if(temp == -1)
//Do something and return something
else
//return null
}
}
现在在上面的代码片段中,我可以使用反射获取变量temp
的初始值。我想知道,如果在执行代码时变量的值发生了变化,我怎样才能获得temp
的新值?我是反思的全新手,所以如果这听起来很傻,请耐心等待。
P.S 我正在测试的实际代码并不是那么简单。我有一种感觉,即我不能在不使用反射或powermock的情况下对最后if
条件进行单元测试。
答案 0 :(得分:4)
你不能像某个方法那样在一个变量上挂钩,这个变量是在某个具有反射的事件之后触发的。您通常在单元测试中执行的操作如下:
如果2.中的动作太多(在这种情况下我会理解你的问题),那么你必须编写更细粒度的单元测试。
此外,如果你想用JUnit检查局部变量,它表明你的方法实现可能过于复杂,应该分开,在这种情况下你可以改进测试,分别使它可以测试。
另请查看问题的答案:Is it bad practice to use Reflection in Unit testing?
答案 1 :(得分:3)
您不能使用反射来访问局部变量的状态。实例变量是,静态变量是,局部变量没有。
另外,正如@platzhirsch所说,反射不允许您将触发器附加到任何类型的变量。这种事情需要某种字节码修改。但是,单元测试不需要触发器。检查前后的数值应该足够了。
我认为你真正的问题是你的课程并不是为了简化单元测试而设计的。首先,你有一个静态的方法,他们很难“嘲笑”。其次,您尝试测试的逻辑似乎是嵌入 in 方法。如果(例如)temp
是实例变量,或者// Some implementation ...
中的代码是您可以模拟的方法,则会容易得多。
顺便说一句,在这种情况下,您对“私人”一词的使用会产生误导。大多数Java程序员会将“private”解释为带有private
修饰符的静态或实例变量。但是您的示例将temp
声明为局部变量for,并且private
修饰符不允许用于局部变量。
答案 2 :(得分:2)
正如其他人所指出的,你不能使用反射来访问局部变量的状态,如果“有任何改变”,你也不能用反射通知你。
然而,可以在调试器中运行代码(例如,在Eclipse调试器中),并在要监视的任何变量上设置“观察点”: