关于java:通过反射检查局部变量值的变化

Checking for change in value of local variable via reflection

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

1
2
3
4
5
6
7
8
9
10
11
12
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条件进行单元测试。


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

  • 检查变量的初始状态
  • 做一些动作
  • 检查变量的状态是否仍然合法
  • 如果2.中的动作太多(在这种情况下我会理解你的问题),那么你必须编写更细粒度的单元测试。

    此外,如果您想使用JUnit检查局部变量,则表明您的方法实现可能过于复杂,应该拆分,在这种情况下,您可以改进测试,分别使其可测试。

    还要看一下问题的答案:在单元测试中使用Reflection是不好的做法吗?


    您不能使用反射来访问局部变量的状态。实例变量是,静态变量是,局部变量没有。

    另外,正如@platzhirsch所说,反射不允许您将触发器附加到任何类型的变量。这种事情需要某种字节码修改。但是,单元测试不需要触发器。检查前后的数值应该足够了。

    我认为你真正的问题在于你的课程并不是为了简化单元测试而设计的。首先,你有一个静态的方法,他们很难"嘲笑"。其次,您尝试测试的逻辑似乎嵌入在方法中。如果(例如)temp是实例变量,或者// Some implementation ...中的代码是您可以模拟的方法,则会容易得多。

    顺便说一句,在这种情况下,您对"私人"一词的使用会产生误导。大多数Java程序员会将"private"解释为带有private修饰符的静态或实例变量。但是您的示例将temp声明为局部变量for,并且private修饰符不允许用于局部变量。


    正如其他人所指出的,你不能使用反射来访问局部变量的状态,也不能使用反射来通知你"如果有任何改变"。

    但是,您可以在调试器中运行代码(例如,在Eclipse调试器中),并在要监视的任何变量上设置"观察点":

    • http://www.javalobby.org/java/forums/t15216.html

    • http://www.vogella.com/articles/EclipseDebugging/article.html