2

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

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?我是反射的新手,所以如果这听起来很傻,请容忍。

PS实际测试的代码并不是这么简单的。if我有一种感觉,如果不使用反射或 powermock ,我无法对最后一个条件进行单元测试。

4

3 回答 3

4

您不能在某个带有反射的事件后触发的变量上挂钩方法之类的东西。您在单元测试中通常会执行以下操作:

  1. 检查变量的初始状态
  2. 做一些动作
  3. 检查变量的状态是否仍然合法

如果 2. 中的操作太多(在这种情况下我会理解您的问题),那么您必须编写更细粒度的单元测试。

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

另请查看问题的答案:在单元测试中使用反射是不好的做法吗?

于 2012-08-06T00:40:12.540 回答
3

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

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

我认为你真正的问题是你的类没有被设计成使单元测试变得容易。首先,您有一个静态方法,它们很难“模拟”。其次,您尝试测试的逻辑似乎嵌入方法中。temp如果(例如)是一个实例变量,或者其中的代码// Some implementation ...是一个可以模拟的方法,那会容易得多。


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

于 2012-08-06T00:39:16.953 回答
2

正如其他人指出的那样,您不能使用反射来访问局部变量的状态,也不能使用反射来通知您“有什么变化”。

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

于 2012-08-06T00:44:34.200 回答