Допустим есть объект, который может пребывать в n разных состояниях и переходить из одного состояния в другое. Не все смены состояния являются допустимыми. Для unit-тестирования этих переходов нам понадобится n*n методов (возможен переход из stateN в stateN). По сути, у нас есть только два тестовых случая - allowed и notallowed.
@org.junit.Test(expected = IllegalStateException.class)
public void switchFromState$N$ToState$K$() {
testObj = new Test($N$);
// не допустимо логикой приложения
testObj.switchToState$K$();
}
public void switchFromState$N$ToState$K$() {
testObj = new Test($N$);
// вызов этого метода не бросит исключение
testObj.switchToState$K$();
assertEquals("iam in state$K$", testObj.toString());
}
При n=4 (16 тестов) уже муторно набирать даже с live templates. Как можно не покидая студию быстро решить эту задачу?
Update
На данный момент решил проблему путём генерации кода через javascript.
const transactionRules = [
allowed("State1", "State1"),
forbidden("State1", "State2"),
allowed("State1", "State3"),
allowed("State1", "State1"),
// ...
forbidden("State5", "State4"),
];
function allowed(currentState, targetState) {
return () => `@Test
public void switchFrom${currentState}To${targetState}Test() {
testObj = new Test(${currentState});
// вызов этого метода не бросит исключение
testObj.switchTo${targetState}();
assertEquals("iam in ${targetState}", testObj.toString());
}
`;
}
function forbidden(currentState, targetState) {
return () => `@Test
public void switchFrom${currentState}To${targetState}Test() {
testObj = new Test(${currentState});
// не допустимо логикой приложения
testObj.switchTo${targetState}();
}
`;
}
transactionRules.forEach((rule) => console.log(rule()));
Если запустить этот скрипт, то мы получим код наших методов. Но написание java-методов через шаблонные строки не очень удобно. Хотелось бы достигнуть таких же результатов не покидая IDE.