【发布时间】:2017-12-01 12:33:05
【问题描述】:
这将是一个很长的问题,由想知道某些东西是如何与传统方法相悖的渴望驱动的。
我遇到了一个非常有趣的应用程序codeacademy,它实际上是在一个 main 方法中测试局部变量。 这是页面的屏幕截图,这让我开始思考这怎么可能。 在stackoverflow中发现了一些类似的问题。
Is it possible to obtain variables in main method from junit test?
How to use BCEL or ASM to get the value of a local declared variable in JAVA?
我不满意知道它不能完成,我想知道的是,有没有一种方法,比如 java 编译器 api 或其他一些方法,可以让我知道这样的应用程序是如何制作的可能的。
【问题讨论】:
-
局部变量的值在测试中无所谓,因为一旦方法退出它们就不存在了。您应该只关心在方法生命周期之外可观察到的事物,例如返回值、异常、成员变量、依赖项上的方法调用。话虽如此,您在调试时可能会关心它们的值;这就是调试器的用途。
-
请避免使用屏幕截图。您可以将代码作为 text 放入您的问题中;您也可以简单地将指令引用为代码。图片不适用于屏幕阅读器 - 您的问题中没有任何内容需要使用图片!
-
可能是使用调试界面。例如在调试时Eclipse,您还可以看到局部变量。并不意味着我会支持对方法内部进行单元测试的想法——一点也不!
-
那么在codeacademy网站上会发生什么,如果你做
myNumber = 21 + 21;,它会接受吗?myNumber = (myNumber = 21) << 1;怎么样?还有myNumber = 21; myNumber <<= 1;? ...它们都将myNumber设置为42,但如果课程检查是基于字符串的,它肯定不会涵盖所有更棘手的变体。 -
然后,它解析文本而不是编译后的代码,因为
myNumber = 21 + 21编译为与myNumber = 42完全相同的字节码。
标签: java unit-testing junit java-bytecode-asm bcel