我有一组JUnit测试,这些测试调用Java程序上的main方法,传入args并检查输出。没关系。
但是,如果我正在测试的程序具有更改的静态值,则测试之间它们将保持不变。这会引起问题。我无法控制正在测试的程序是什么,也无法控制用于静态字段的名称。
如何确保单元测试可以正常运行,就好像它是从头开始运行程序一样,而无需保留这些静态字段。是否可以通过某种方式重设它们?
如果没有,我将不得不启动一个运行程序的新进程,然后检查输出等,但这似乎有点过大。
编辑-请注意,我无法控制单元测试正在测试的代码-我无法更改其字段名,而且不幸的是,我也不会知道其字段名。我在想,如果不开始新的流程就无法做到这一点?
通常,如果您发现代码不可测试,就像这里的问题一样,那是代码气味的迹象,并且您应该认真考虑将代码重构为不使用那些静态字段。
话虽如此,您可能会发现BeanInject库很有帮助。您可以将带@After
注释的方法放入测试类,并使用注入方法将其重置为静态字段:
Inject.field("thatStaticField").of(thatObjectWithStaticFields).with("default value");
这样,您只需要知道字段名称,而不必真正使用字段来修改类。该库使用反射来实现。
另外,我想到,如果要测试的东西包含无法控制的部分,为什么不尝试使用Mockito模拟那些部分呢?
编辑/添加:
好的,所以您的问题是,您甚至不知道类可能具有或可能不具有的静态变量的初始值。我看到了两种可能的方法:1)您必须在首次加载类时保存它们的值,然后在每次测试之间重置值,或者2)您必须从该类中获取该类的全新实例。类加载器。
在第1点),您需要使用反射来遍历@BeforeClass方法中的所有字段,将它们的初始值保存到某个Map<String,Object>
结构中,然后在@Before或@After方法中重置值。
关于第2点,您在此处具有相应的说明(涉及类加载器):Java:如何“重新启动”静态类?
您可以使用反射之类的东西来做,这很酷。:)
我正在为一个叫Student的班写一些junit测试。基本上,每个学生都有一个studentNum,它被设置为一个迭代器,迭代器是一个私有静态int。每次创建新学生时,studentNum都会递增。 我对一个函数进行了几个测试,该函数从传入的学生数组列表中获取studentNum为1的学生。然而,每次我在一个新测试中创建一个新的学生数组列表时,studentNum从上一个测试的studentNum
我目前正在做一个春装项目。我正在为一个类编写一个JUnit 5测试,如下所示, 我想知道是否有一种方法可以模拟“SomeOtherClass.someStaticField”的用法,这样我就可以测试我的类“TheClassUnderTest”了。我也用Mockito,所以任何用Mockito的回答也欢迎
配置:11400:arm-linux-gnueabihf-gcc-o conftest-g-o2-i/home/user/rpi_dev/lib/include conftest.c-lz-lm>&5/home/user/rpi_dev/xtools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm
我正在为我的项目编写junit测试用例,但我在这里面临一个问题,就是我在我的一个java类(GraphNodes.java)中使用的方法 这是我的Junit测试类 我的junit失败了,它说excepted<3>但actual<0>而且我不能将静态方法仅改为public,因为这会影响代码的某些功能,而且由于我是junit的新手,所以我不知道如何解决这一问题。所以有人能在这里帮助我吗?谢谢!!
问题内容: 我正在使用JUnit4和Cobertura仅使用静态方法测试助手类。测试方法是一项容易的任务,并且已经完成。 但是,cobertura显示该类没有被测试完全覆盖,因为它没有在任何地方实例化。 我不想创建此类的实例(它是一个帮助程序类),因此第一个解决方案是隐藏构造函数(这通常是帮助程序类的好方法)。 然后,cobertura抱怨测试未涵盖空的私有构造函数。 有什么解决方案可以在这种情况
问题内容: 在我们的项目中,我有几个JUnit测试,例如从目录中获取每个文件并对其进行测试。如果我在中实现了一种方法,那么它只会显示为可能失败或成功的一项测试。但是我对每个文件的结果都很感兴趣。如何编写一个/ 使得每个文件显示为单独的测试,例如在Eclipse的图形TestRunner中?(为每个文件编写显式测试方法不是一种选择。) 问题答案: 看看JUnit 4 中的 参数化测试 。 实际上,我