函数(无副作用的函数)是这样一个基本的构建块,但我不知道在 Java 中测试它们的令人满意的方法。
我正在寻找使测试更容易的技巧的指针。这是我想要的一个例子:
public void setUp() {
myObj = new MyObject(...);
}
// This is sooo 2009 and not what I want to write:
public void testThatSomeInputGivesExpectedOutput () {
assertEquals(expectedOutput, myObj.myFunction(someInput);
assertEquals(expectedOtherOutput, myObj.myFunction(someOtherInput);
// I don't want to repeat/write the following checks to see
// that myFunction is behaving functionally.
assertEquals(expectedOutput, myObj.myFunction(someInput);
assertEquals(expectedOtherOutput, myObj.myFunction(someOtherInput);
}
// The following two tests are more in spirit of what I'd like
// to write, but they don't test that myFunction is functional:
public void testThatSomeInputGivesExpectedOutput () {
assertEquals(expectedOutput, myObj.myFunction(someInput);
}
public void testThatSomeOtherInputGivesExpectedOutput () {
assertEquals(expectedOtherOutput, myObj.myFunction(someOtherInput);
}
我正在寻找一些可以放在测试、MyObject 或 myFunction 上的注释,以使测试框架在我给出的给定输入/输出组合的所有可能排列中自动重复对 myFunction 的调用,或者某些子集可能的排列,以证明该函数是功能性的。
例如,上面(仅)两个可能的排列是:
- myObj = new MyObject();
- myObj.myFunction(someInput);
- myObj.myFunction(someOtherInput);
和:
- myObj = new MyObject();
- myObj.myFunction(someOtherInput);
- myObj.myFunction(someInput);
我应该只能提供输入/输出对(someInput,expectedOutput)和(someOtherInput,someOtherOutput),其余的由框架完成。
我没有使用过 QuickCheck,但它似乎不是一个解决方案。它被记录为生成器。我不是在寻找一种为我的函数生成输入的方法,而是一个让我以声明方式指定我的对象的哪一部分是无副作用的框架,并使用基于该声明的一些排列来调用我的输入/输出规范。
更新:我不想验证对象没有任何变化,记忆功能是这种测试的典型用例,记忆器实际上改变了它的内部状态。但是,给定一些输入的输出始终保持不变。