我使用大量静态方法对SDK进行单元测试。而且我不希望我在test1()中执行的操作对我在test2()中执行的操作产生影响。在每次测试开始时,我都需要SDK中的所有静态变量返回到未初始化状态,就好像它们没有被加载一样。然后再次加载它们。有关如何做到这一点的任何建议?在Robolectric有类似的东西吗?因为我用它进行单元测试。在计划英语中,我基本上想要的是在每次测试开始时都是干净的。
@Test
public void test1() throws Exception {
// Setup all the device info values
MyDeviceInfoClass.setDeviceModel().equals("Nexus 4");
MyDeviceInfoClass.setDeviceOperatingSystem().equals("Android_3.4b5");
// Verify all the device info values set previously
assertTrue(MyDeviceInfoClass.getDeviceModel().equals("Nexus 4"));
assertTrue(MyDeviceInfoClass.getDeviceOperatingSystem().equals("Android_3.4b5"));
}
这是第一次测试而且成功了。就应该这样。然后在第二次测试中:
@Test
public void test2() throws Exception {
// Setup all the device info values
MyDeviceInfoClass.setDeviceOperatingSystem().equals("Android_4.2");
//The following line also succeeds if test1() is finished. But I do not want that. This line should throw an assertion error because we did not specify what the device is over here in test2().
assertTrue(MyDeviceInfoClass.getDeviceModel().equals("Nexus 4"));
//This will succeed just the way it should be.
assertTrue(MyDeviceInfoClass.getDeviceOperatingSystem().equals("Android_4.2"));
}
我不希望第一个测试中设置的值对第二个测试中提取的值产生影响。上面显示的测试是简单的例子。但是我单元测试的SDK比这更复杂。
更清楚地说,我不希望test1()中设置的值对test2()中的操作产生任何影响。如果我在test1()中将设备模型设置为Nexus 4,就像这样MyDeviceInfoClass.setDeviceModel()。equals(" Nexus 4"),第二个测试test2()不必在何时知道它我通过MyDeviceInfoClass.setDeviceModel()。equals(" Nexus 4")获取它。我希望我的单元测试之间完全隔离。
也不能选择远离静态方法。请告诉我如何实现这一目标。
修改 由于项目中涉及某些复杂性,因此无法在测试开始之前重置所有静态变量。
答案 0 :(得分:3)
卸载静态变量的唯一时间是加载有问题的类的加载器是垃圾收集的。
解决问题的一种方法是使用自己的类加载器。有一个很好的问题here,它涵盖了相当广泛的细节。
另一种选择是在每次测试之前简单地重置值。您可以在测试类中提供一个@Before
带注释的方法,如果需要,可以使用反射重置它们。