【问题标题】:Checking for change in value of local variable via reflection通过反射检查局部变量值的变化
【发布时间】:2012-08-06 00:32:29
【问题描述】:

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

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
  }
}

现在在上面的sn-p中,我可以通过反射得到变量temp的初始值。我想知道,如果变量的值在执行代码时发生变化,我怎样才能获得temp 的新值?我完全是反射新手,所以如果这听起来很愚蠢,请容忍。

P.S 正在测试的实际代码并非如此简单。我有一种感觉,如果不使用反射或 powermock,我无法对最后一个 if 条件进行单元测试。

【问题讨论】:

    标签: java reflection junit


    【解决方案1】:

    您不能将类似方法之类的东西挂在一个变量上,该变量是在某个事件后通过反射触发的。你在单元测试中通常做的事情如下:

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

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

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

    也看看问题的答案:Is it bad practice to use Reflection in Unit testing?

    【讨论】:

      【解决方案2】:

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

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

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


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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我使用 Jenkins 构建并使用 clover 来检查代码覆盖率,因此我认为我做不到你所说的。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多