Как запустить модульные тесты для двух разных форматов файлов? - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно протестировать систему, которая работает одинаково с форматами файлов YAML и JSON. Я написал несколько модульных тестов для базы данных, но хочу запустить их в обоих форматах. Все, что мне нужно изменить, - это путь к тестам. Я использую Java 8 и org.junit.jupiter.

import static org.junit.jupiter.api.Assertions.*;

public class DatabaseTests {

    //Need to re-test for "src\\test\\java\\backend\\database\\testDB.yaml"
    private final static String TEST_DB_JSON = "src\\test\\java\\backend\\database\\testDB.json";

    private static byte[] testFileState;

    @BeforeAll
    static void setUp() {
        try {
            testFileState = Files.readAllBytes(Paths.get(TEST_DB_JSON));
            reloadDatabase();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @AfterEach
    void resetFile() {
        try (FileOutputStream fos = new FileOutputStream(TEST_DB_JSON)) {
            fos.write(testFileState);
        } catch (IOException e) {
            e.printStackTrace();
        }
        reloadDatabase();
    }

    //A bunch of unit tests

Я не хочу просто копировать и вставлять весь класс и изменять только одну переменную, но я не могу понять, как это сделать, сделать класс абстрактным или что-то. Тесты работают одинаково для обоих файлов (как и код моей базы данных), и оба файла содержат одни и те же данные теста.

1 Ответ

1 голос
/ 31 марта 2020

Вы можете использовать Параметризованные тесты jUnit5 : аннотированные тесты будут выполняться для каждого значения, возвращаемого "MethodSource"

    private final static String TEST_DB_JSON = "src\\test\\java\\backend\\database\\testDB.json";
    private final static String TEST_DB_YAML = "src\\test\\java\\backend\\database\\testDB.yaml";

    private List<byte[]> inputFiles() {
        byte[] jsonTestFileState;
        byte[] yamlTestFileState;
        try {
            jsonTestFileState = Files.readAllBytes(Paths.get(TEST_DB_JSON));
            yamlTestFileState = Files.readAllBytes(Paths.get(TEST_DB_YAML));
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        return Arrays.asList(jsonTestFileState, yamlTestFileState);
    }

    @ParameterizedTest
    @MethodSource("inputFiles")
    void shouldDoSomething(byte[] testFileState) {
       // This method will be called twice: the 1st time with
       // jsonTestFileState as the value of the argument 
       // and the second time with yamlTestFileState
    }
...