使用抽象类进行通用测试

时间:2015-10-16 15:28:27

标签: java junit

我可以(我想我更重要的是,我应该)在抽象类中包装通用的junit测试吗?

例如,我有一组正在测试的类都使用缓存 - 显然最好在那里进行测试以确保我实际上正确地缓存了东西...这个测试代码几乎是每个类都相同,但有一些关于缓存对象创建的细节。

这样做可以吗?

abstract class Foo {
    Baz baz;

    @Before
    abstract void setUp();

    @Test
    public void testMyBaz() {
        // ...
    }

}

public class Bar extends Foo {
    void setUp() {
        // set my baz
    }

    // other, more specific tests
}

3 个答案:

答案 0 :(得分:3)

这样做是可以的,但在大多数情况下,当你需要它时,你只需要数据工厂,在JUnit中它就是这样做的:

@RunWith(Parametrized.class)
public class SumTest {
    @Parameters
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] {{1, 2, 3}, {3, 4, 7}});
    }

    private int a, b, sum;
    public SumTest(int a, int b, int sum) {
        this.a = a;
        this.b = b;
        this.sum = sum;
    }

    @Test
    public void testSum() {
        Assert.assertEquals(a + b, sum);
    }
}

答案 1 :(得分:0)

是的,你应该这样做。它允许您重用您的抽象类,并自定义您的设置,同时还运行类似的测试。

答案 2 :(得分:0)

一般而言,单元测试需要更具体地了解您正在测试的内容。虽然你的方法可能没有任何问题,但你从根本上违反了单元测试的原则。

尝试独立使用缓存逻辑独立测试缓存逻辑和功能。在测试功能时,理想情况下无需重新测试缓存逻辑。