我正在努力提高我的测试知识,我正在努力实现运行相同的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”,但我认为这些都没有什么帮助。
3条答案
按热度按时间dgjrabp21#
您可以使用MethodSource撰写参数化测试。
hxzsmxv22#
一种解决方法是在测试类中创建一个方法,该方法将
Base obj
作为输入,并包含所有重复的行。然后,在不同的测试中初始化obj
,然后将其传递给该方法。下面是一段代码,可以完成这项工作:根据经验,测试与正常编程非常相似,其中通过方法避免冗余以保证可重用性。
干杯,
D级
vhmi4jdf3#
首先 , 你 必须 确定 你 对 * UnitTesting * 的 理解 。
UnitTesting * * 不是 * * 关于 代码 ( 覆盖 率 ) 的 。
UnitTesting 是 关于 验证 * 期望 的 公共 行为 * , 其中 " 公共 行为 " 意味 着 * 返回 值 * 和/或 * 与 依赖 项 的 通信 * 。 每个 测试 方法 都 应该 验证 被 测 单元 期望 行为 的 * 单个 原子 假设 * 。
从 这个 Angular 来看 , 通过 相同 的 测试 方法 传递 一 组 共享 相同 接口 的 对象 是 没有 意义 的 , 因为 存在 这些 不同 的 接口 实现 , 以 实现 具有 它们 * 自己 独特 行为 * 的 接口 方法 。 反过来 , 假设 对象 如何 独特 地 行为 也 是 不同 的 。
如果 预期 所有 对象 的 行为 相同 ( 这 是 单个 测试 方法 可以 验证 的 唯一 假设 ) , 则 首先 没有 不同 的 对象 ( 即 实现 ) 。