我有setter函数,通过在更改私有变量之前将其传递给验证函数来检查它们的输入数据。如果数据无效,则getter函数会抛出异常。如何在不重复所有输入测试用例的情况下对setter函数和数据验证函数进行单元化?这两个函数都以相同的方式验证数据。
编辑:对不起,我应该包含代码来开始。
setterFunction(String value) {
if (valueValid()) {
// Update member variable
} else {
throw new RuntimeException("Invalid Data");
}
}
valueValid()和setterFunction都在相同的值上失败,因此我不希望有重复的测试代码。
答案 0 :(得分:0)
我认为用所有测试用例测试验证器是明智的,然后测试setter和getter使用一两个简单的情况正确调用验证器。
这种方式如果出现问题 - 您也可以更好地了解错误的位置(验证器或设置者/获取者)
答案 1 :(得分:0)
您也可以设计不同的对象。让您的对象定义一个构造函数,该构造函数需要一个最小的信息子集才能正确构造一个对象。然后有另一个方法repInvariant()(Liskov),它将验证对象中的所有内部变量是否可以组合加入。
然后,如果你有一个setter,它可以在设置变量后简单地调用repInvariant()。甚至可能撤消set方法调用。
public class A
public A(B b, Cc...) {
this.b = b;
...
this.repInvariant();
}
public void setB(B b) {
var oldB = this.b;
try {
this.b = b;
this.repInvariant();
} catch (InvalidArgumentException e) {
this.b = oldB;
throw e;
}
}
public void repInvariant() {
if (this.b == null) {
throw new IllegalArgumentException("B must not be null");
}
}
}