Как обработать упорядочивание @Rule, когда они зависят друг от друга

Я использую встроенные серверы, которые работают в тестовых сценариях Junit. Иногда эти серверы требуют рабочего каталога (например, Сервер каталогов Apache).

Новый @Rule в Junit 4.7 может обработать эти случаи. TemporaryFolder-правило может создать временный каталог. Пользовательское ExternalResource-правило может быть создано для сервера. Но как делают я обрабатываю, если я хочу передать результат одного правила в другого:

import static org.junit.Assert.assertEquals;
import java.io.*;
import org.junit.*;
import org.junit.rules.*;

public class FolderRuleOrderingTest {

    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

    @Rule
    public MyNumberServer server = new MyNumberServer(folder);

    @Test
    public void testMyNumberServer() throws IOException {
        server.storeNumber(10);
        assertEquals(10, server.getNumber());
    }

    /** Simple server that can store one number */
    private static class MyNumberServer extends ExternalResource {

        private TemporaryFolder folder;

        /** The actual datafile where the number are stored */
        private File dataFile;

        public MyNumberServer(TemporaryFolder folder) {
            this.folder = folder;
        }

        @Override
        protected void before() throws Throwable {
            if (folder.getRoot() == null) {
                throw new RuntimeException("TemporaryFolder not properly initialized");
            }

            //All server data are stored to a working folder
            File workingFolder = folder.newFolder("my-work-folder");
            dataFile = new File(workingFolder, "datafile");
        }

        public void storeNumber(int number) throws IOException {
            dataFile.createNewFile();
            DataOutputStream out = new DataOutputStream(new FileOutputStream(dataFile));
            out.writeInt(number);
        }

        public int getNumber() throws IOException {
            DataInputStream in = new DataInputStream(new FileInputStream(dataFile));
            return in.readInt();
        }
    }
}

В этом коде папка отправляется в качестве параметра в сервер так, чтобы сервер мог создать рабочий каталог, чтобы хранить данные. Однако это не работает, потому что Junit обрабатывает правила в обратном порядке, поскольку они определяются в файле. Правило TemporaryFolder не будет выполняться перед Правилом сервера. Таким образом корневая папка в TempraryFolder будет пустой, заканчиваясь, что любые файлы создаются относительно текущего рабочего каталога.

Если я инвертирую порядок атрибутов в моем классе, я получаю ошибку компиляции, потому что я не могу сослаться на переменную, прежде чем это будет определено.

Я использую Junit 4.8.1 (потому что упорядочивание правил было зафиксировано немного от этих 4,7 выпусков),

32
задан Cœur 6 August 2017 в 10:26
поделиться

1 ответ

Если вы не найдете нормального решения, вы всегда можете создать составное правило (и единственное, имеющее аннотацию @Rule ), которое содержит все остальные и выполняет их по порядку.

3
ответ дан 27 November 2019 в 20:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: