通过反射检查局部变量值的变化

时间:2012-08-06 00:32:30

标签: java reflection junit

这是我第一次尝试使用反射进行单元测试,我有这个疑问。

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条件进行单元测试。

3 个答案:

答案 0 :(得分:4)

你不能像某个方法那样在一个变量上挂钩,这个变量是在某个具有反射的事件之后触发的。您通常在单元测试中执行的操作如下:

  1. 检查变量的初始状态
  2. 做一些行动
  3. 检查变量的状态是否仍然合法
  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调试器中),并在要监视的任何变量上设置“观察点”: