Тестируйте метод в абстрактном классе один раз и не для каждой реализации - PullRequest
0 голосов
/ 11 июня 2019

На данный момент у меня есть абстрактный класс, который реализует интерфейс.Все реализации расширяют абстрактный класс для создания собственной реализации методов интерфейса.

Абстрактный класс содержит методы, которые являются одинаковыми для каждой реализации, например, метода execute.Я не хочу включать один и тот же тест 'execute' для каждого класса реализации.

Я могу успешно протестировать метод execute в абстрактном классе, создав тестовый класс для одного из классов реализации.Проблема в том, что будет больше классов, расширяющих этот абстрактный класс, и я не хочу писать один и тот же тест выполнения в каждом из этих классов.

Я хотел бы как-то протестировать метод execute из абстрактного классатолько один раз в определенном тестовом классе, поэтому я могу тестировать только логику реализации всех других классов.

Ответы [ 3 ]

0 голосов
/ 11 июня 2019
public interface BlaInterface {
    public String getData();
}

public abstract class AbstractBla implements BlaInterface {

    // methot to test only once and not for each class extending this
    public void execute() {

        // do some stuff which is the same for each extending class
        getData();
    }
}

public class BlaBla extends AbstractBla {

    public String getData() {
        return "Blabla";
    }
}

Так что F.E. вышеупомянутые классы я могу проверить метод execute (), протестировав класс BlaBla. Но будет больше классов, расширяющих абстрактный класс, и я считаю уродливым ставить тест execute () просто случайно в одном из этих классов.

Так что я бы хотел абстрактный тест для классов execute и других тестов только для тестирования getData f.e.

0 голосов
/ 11 июня 2019

Вы также можете создать параметризованный тестовый класс, который будет принимать в качестве входных данных экземпляры с ожидаемым результатом и выполнять тесты. (Однако, если у вас много логики проверки, которая сильно отличается в разных экземплярах, подход @vlumi для создания абстрактного тестового класса может работать лучше, потому что вы можете переместить логику проверки в абстрактные методы.)

public class MyParameterizedTests {

    @ParameterizedTest
    @MethodSource("getTestData")
    public void test(TestData data) {
        assertEquals(data.expectedResult, data.instance.compute());
    }

    public static TestData[] getTestData() {
        return new TestData[] { new TestData(new X(), "x"), new TestData(new Y(), "y") };
    }
}

class TestData {
    public MyInterface instance;
    public String expectedResult;

    public TestData(MyInterface instance, String expectedResult) {
        this.instance = instance;
        this.expectedResult = expectedResult;
    }
}

interface MyInterface {
    String compute();
}

class X implements MyInterface {

    @Override
    public String compute() {
        return "x";
    }
}

class Y implements MyInterface {

    @Override
    public String compute() {
        return "y";
    }
}
0 голосов
/ 11 июня 2019

Вы также можете создать тестовый класс для своего абстрактного класса.Хотя вы не можете создать экземпляр абстрактного класса напрямую, вы все равно можете создать конкретный класс реализации в своем тестовом файле, просто для тестирования абстрактного класса, реализуя необходимые методы.Вы можете получить экземпляр для тестирования, например, используя анонимный класс:

AbstractClassType x = new AbstractClassType() {
    @Override
    public void doSomething() {
        // ...
    }
};
...