2014-02-07 24 views
1

我一直在使用JUnit几年,并且发现了很多例子,其中测试中的隔离并不完整。如何在JUnit测试中使用属性?

大多数I开发的试验遵循相同的结构

class ClassToTestTest { 

    // Attributes 
    private ClassToTest objectToTest; 

    // Methods 
    @Before 
    public void setup() { 
     objectToTest = new ClassToTest(); 
    } 

    @Test 
    public void test1() { 
     //do something 
     Assert... 
    } 

    @Test 
    public void test2() { 
     //do something 
     Assert... 
    } 
} 

测试对象(不是ClassToTest对象但对象执行所测试)的内部状态是在其属性。如果setup()或teardown()方法存在任何缺陷,则objectToTest的某些内部状态可能会潜入其他测试中。

想知道,没有共享状态会更好吗?你有没有属性

class ClassToTestTest { 

    // Attributes 
    // No attributes, no internal state 

    // Methods 
    @Before 
    public void setup() { 
     objectToTest = new ClassToTest(); 
    } 

    @Test 
    public void test1() { 
     localObjectToTest = createObjectToTest(); 
     //do something 
     Assert... 
    } 

    @Test 
    public void test2() { 
     localObjectToTest = createObjectToTest(); 
     //do something 
     Assert... 
    } 
} 

我所知道的第一个代码做的是几乎比第二相同,但在第一个代码,你禁不住要像做

// Methods 
@Before 
public void setup() { 
    objectToTest = objectToTest.reset(); 
} 

或更糟的是,依靠先前的测试是为了使用前一次测试中的objectToTest的状态来“节省”时间,并最终得到一个空的setup()方法

继第二个代码很难达到这一点,因为存在没有共享状态,每个对象都是本地的。

你的想法是什么?合理?它值得吗?

回答

3

的JUnit创建为每个测试方法的新ClassToTestTest对象。因此,没有领域可以潜入另一个测试。详情:http://martinfowler.com/bliki/JunitNewInstance.html

+0

哇!我不知道。谢谢,相当丰富。 似乎TestNG不这么做。很高兴知道。 –

-1

在我看来,我认为这是值得每个测试创建一个ClassToTestTest对象,因为它是可以修改的内部状态和每个测试应该独立于其他的的。

一个更急切的开发人员可以告诉你,你也在测试每个测试中对象的构造函数。然后,您还可以在创建和销毁对象的方法中使用@Before和@After注释。

但无论如何,我宁愿去在每个测试中创建对象。

编辑:添加加粗字体把文本更具可读性