通过反射检查局部变量的值是否发生变化。

11 浏览
0 Comments

通过反射检查局部变量的值是否发生变化。

这是我第一次尝试使用反射进行单元测试,我有一个疑问。\n在上面的代码片段中,我可以使用反射获取变量temp的初始值。我想知道,如果在代码执行过程中变量的值发生变化,我如何获取temp的新值?我对反射完全不了解,如果这听起来很愚蠢,请包容一下。\nP.S 我正在测试的实际代码并不像这么简单。我觉得我不能在不使用反射或powermock的情况下对最后的if条件进行单元测试。

0
0 Comments

无法使用反射来访问局部变量的状态,也无法使用反射来通知您是否有“任何变化”。但是,您可以在调试器中运行代码(例如,使用Eclipse调试器),并在要监视的任何变量上设置“观察点”。我使用Jenkins来构建和检查代码覆盖率,因此我不认为我可以做你所说的。

0
0 Comments

在使用反射来访问局部变量的状态时是不允许的。实例变量和静态变量是可以的,但是局部变量不行。

另外,反射也不允许你为任何类型的变量附加触发器。这种情况需要对字节码进行修改。然而,单元测试并不需要触发器。只需要在之前和之后检查值即可。

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

顺便说一句,你在这个上下文中使用“private”这个术语是具有误导性的。大多数Java程序员会将“private”解释为具有private修饰符的静态或实例变量。但是你的示例中,temp被声明为局部变量,局部变量不允许使用private修饰符。

0
0 Comments

通过反射检查局部变量值是否改变的问题是因为不能使用反射来钩住在某个事件之后触发的变量的方法。在单元测试中,通常会执行以下操作:

1. 检查变量的初始状态

2. 执行某些操作

3. 检查变量的状态是否仍然合法

如果第2步中的操作太多(在这种情况下,我可以理解你的问题),那么你需要将单元测试写得更细致。

此外,如果你想使用JUnit检查局部变量,这说明你的方法实现可能过于复杂,应该将其拆分,从而改善测试,或者使其可测试。

还可以查看以下问题的答案:《在单元测试中使用反射是不好的实践吗?》

0