使用从同一接口派生的多个对象运行同一Junit测试

wbgh16ku  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(103)

我正在努力提高我的测试知识,我正在努力实现运行相同的JUnit测试类,这些测试类带有从相同接口派生的不同对象。
因此我们可以假设如下:

interface Base {
    void sort();
}

class  A implements Base {
    @Override
    public void sort() {
        //sort naively
    }
}

class  B implements Base {
    @Override
    public void sort() {
        //sort using another better approach
    }
}

class  C implements Base {
    @Override
    public void sort() {
        //sort using optimized approach
    }
}
class Test {
    @Test
    void test1() {

        Base obj = new A();
        obj.sort();
        obj.otherStuff();
    }
}
class SecondTest {
//trying to avoid making multiple test classes that has only one line in difference
@Test
void test1() {
    var obj = new B();
    obj.sort();
    obj.otherStuff();
}

因此,我的问题是如何使用来自A、B、C的对象运行测试类,而不陷入重复代码和冗余的陷阱?
请注意,我写这个例子只是为了说明我的观点,sort()doStuff()方法只是占位符,但是当你在每个测试类中有超过70行的代码重复时,它开始看起来很难看和多余。

  • 我看过"beforeEach“、" Before”和“After”,但我认为这些都没有什么帮助。
dgjrabp2

dgjrabp21#

您可以使用MethodSource撰写参数化测试。

@ParameterizedTest
@MethodSource("bases")
void test1(Base obj) {
  obj.sort();
  obj.otherStuff();
}

static Stream<String> bases() {
  return Stream.of(new A(), new B(), new C());
}
hxzsmxv2

hxzsmxv22#

一种解决方法是在测试类中创建一个方法,该方法将Base obj作为输入,并包含所有重复的行。然后,在不同的测试中初始化obj,然后将其传递给该方法。下面是一段代码,可以完成这项工作:

class Test {
@Test
void test1() {

    Base obj = new A();
    wrapperMethod(obj);
}
@Test
void test2() {
   var obj = new B();
   wrapperMethod(obj);
 }

public static void wrapperMethod(Base obj){
obj.sort();
obj.otherStuff();
}
}

根据经验,测试与正常编程非常相似,其中通过方法避免冗余以保证可重用性。
干杯,
D级

vhmi4jdf

vhmi4jdf3#

首先 , 你 必须 确定 你 对 * UnitTesting * 的 理解 。
UnitTesting * * 不是 * * 关于 代码 ( 覆盖 率 ) 的 。
UnitTesting 是 关于 验证 * 期望 的 公共 行为 * , 其中 " 公共 行为 " 意味 着 * 返回 值 * 和/或 * 与 依赖 项 的 通信 * 。 每个 测试 方法 都 应该 验证 被 测 单元 期望 行为 的 * 单个 原子 假设 * 。
从 这个 Angular 来看 , 通过 相同 的 测试 方法 传递 一 组 共享 相同 接口 的 对象 是 没有 意义 的 , 因为 存在 这些 不同 的 接口 实现 , 以 实现 具有 它们 * 自己 独特 行为 * 的 接口 方法 。 反过来 , 假设 对象 如何 独特 地 行为 也 是 不同 的 。
如果 预期 所有 对象 的 行为 相同 ( 这 是 单个 测试 方法 可以 验证 的 唯一 假设 ) , 则 首先 没有 不同 的 对象 ( 即 实现 ) 。

相关问题