Запустите новую JVM в модульном тесте - PullRequest
0 голосов
/ 10 октября 2018

У меня есть класс, который блокирует файлы.(См. Ниже.) Теперь у меня есть модульный тест, который подтверждает успешную блокировку между двумя потоками в одной виртуальной машине.Тем не менее, я бы на самом деле имел замки, работающие между двумя виртуальными машинами.В связи с этим возникает вопрос: как бы я запустил другую JVM в отдельном процессе?

Спасибо,

Йохен

public class FileLocker {
public static interface StreamAccessor {
    InputStream getInputStream();
    OutputStream getOutputStream();
}
public static void runLocked(File pFile, Consumer<StreamAccessor> pConsumer) {
    Function<StreamAccessor,Object> function = (sa) -> { pConsumer.accept(sa); return null; };
    callLocked(pFile, function);
}
public static <T> T callLocked(File pFile, Function<StreamAccessor,T> pConsumer) {
    try (final RandomAccessFile raf = new RandomAccessFile(pFile, "rw");
            final FileChannel channel = raf .getChannel();
            final FileLock lock = channel.lock()) {
        final StreamAccessor sa = new StreamAccessor() {
            @Override
            public OutputStream getOutputStream() {
                return Channels.newOutputStream(channel);
            }

            @Override
            public InputStream getInputStream() {
                return Channels.newInputStream(channel);
            }
        };
        final T t = pConsumer.apply(sa);
        return t;
    } catch (Throwable thr) {
        throw Exceptions.show(thr);
    }
}

}

1 Ответ

0 голосов
/ 10 октября 2018

Вы делаете это так же, как и любой другой процесс, используя ProcessBuilder .См. здесь , например.

Вы "просто" должны вызвать другой процесс, который запускает вашу команду java, включая все необходимые параметры командной строки и так далее.Сложная часть может быть гарантировать, что второй процесс JVM завершается правильно, когда вы этого хотите.

Помимо этого: вам не следует называть это unit test тогда.«Истинный» модульный тест пытается смоделировать / заглушить любую такую ​​зависимость.С этой точки зрения вы пытаетесь провести функциональный / интеграционный тест.Или, если поменять эту мысль: в модульном тесте вы действительно не должны использовать разные JVM.

Наконец: будьте уверены в том, что вы собираетесь тестировать.Вам не нужно проверять блокировку самой.Это особенность, которую JVM предоставляет для соответствующей операционной системы.Нет смысла проверять, работает ли блокировка.

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

...