如何在 JUnit 测试中使用属性?

Die*_*ado 2 java installation junit attributes unit-testing

我已经使用 JUnit 几年了,我发现了许多测试中隔离不完整的例子。

我开发的大多数测试都遵循相同的结构

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...
    }
}
Run Code Online (Sandbox Code Playgroud)

测试对象(不是 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...
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道第一个代码和第二个代码做的差不多,但是在第一个代码中你很想做类似的事情

// Methods
@Before
public void setup() {
    objectToTest = objectToTest.reset();
}
Run Code Online (Sandbox Code Playgroud)

或者更糟糕的是,依赖之前的测试,以便使用之前测试中 objectToTest 的状态来“节省”时间,最终得到一个空的 setup() 方法

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

你怎么看?有道理?值得吗?

Ste*_*ner 5

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