3

Допустим есть объект, который может пребывать в 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.

alvoro
  • 3,065

0 Answers0