2013-07-05 34 views
4

我使用大量静态方法对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()中将设备模型设置为test1(),就像这个MyDeviceInfoClass.setDeviceModel()。equals(“Nexus 4”),当我通过My​​DeviceInfoClass.setDeviceModel获取它时,第二个测试test2()不必知道它().equals(“Nexus 4”)。我想在我的单元测试之间完全隔离。

远离静态方法不是一种选择。请告诉我如何才能做到这一点。

编辑: 测试开始前清除所有的静态变量是不是因为某些参与该项目的复杂性,任何一个选项。

+0

你有没有考虑过把每个测试放在一个单独的程序中?这将隔离它们,并确保每个测试都以新鲜初始化的类开始。 –

+0

你是指在不同的文件?在这种情况下,不可能为每个单元创建一个不同的项目。 – iamronak

+0

是的,每个文件一个测试。 –

回答

3

静态变量被卸载的唯一时间是何时加载相关类的类加载器被垃圾收集。

解决你的问题的一种方法是使用你自己的类加载器。有一个很好的SO问题here涵盖了这个相当广泛的细节。

另一种选择是简单地在每次测试之前重置数值。你可以在你的测试类中提供一个@Before注解的方法来重置它们,必要时使用反射。

+0

我考虑过重置值的想法,但在这种情况下不太可能。比这更复杂。你能链接我关于使用自定义类加载器的问题吗?我觉得这是一个选择。但我想知道是否有另一种方法来实现我想要做的事情。 – iamronak

+0

@iamronak - 此链接在答案中。我想我会选择类加载器。 –

+0

ooh..yes ..我刚刚看到链接..不介意.. – iamronak