Функции (без побочных эффектов) являются таким фундаментальным строительным блоком, но я не знаю удовлетворительного способа их тестирования в 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, Ожидаемый выход) и (someOtherInput, someOtherOutput) иFramework должен сделать все остальное.
Я не использовал QuickCheck, но, похоже, это не решение проблемы.Это задокументировано как генератор.Я не ищу способ генерировать входные данные для моей функции, а скорее среду, которая позволяет декларативно указывать, какая часть моего объекта не имеет побочных эффектов, и вызывать мою спецификацию ввода / вывода, используя некоторую перестановку, основанную на этом объявлении.
Обновление: я не собираюсь проверять, что в объекте ничего не меняется, функция напоминания является типичным вариантом использования для такого типа тестирования, а мемоизер фактически меняет свое внутреннее состояние.Тем не менее, выходные данные с некоторыми входными данными всегда остаются неизменными.