Как запустить / остановить приложение java во время интеграционного теста junit - PullRequest
0 голосов
/ 05 мая 2020

Я провел изрядное количество исследований и не вижу хорошего способа сделать это. У меня есть приложение java, в котором есть интеграционные тесты. Для интеграционных тестов тесты должны запускать фактическое приложение. Это делается так в каждом тесте junit.

@BeforeClass
final public static void setup() {
    Application.main(new String[]{});
}

Но как мне закрыть приложение? Я заметил, что после завершения тестов junit он остается как мошеннический процесс. Кроме того, я делал это с помощью Springboot раньше и знаю, что Springboot предоставляет аннотации. Однако мы не можем использовать для этого springboot. Поэтому мне нужно найти не пружинный способ. Как закрыть приложение в тесте junit?

1 Ответ

0 голосов
/ 06 мая 2020

Я не могу воспроизвести это с помощью Gradle 6.3 и JUnit 5; Я кратко вижу процесс [java] <defunct> в выводе ps, и он исчезает сам по себе. Может быть, это потому, что я запускаю только один набор тестов, а когда вы запускаете больше, вам нужно будет выполнять очистку после каждого.

Тем не менее, посмотрите на Java API процесса . Запустите приложение, как в этот вопрос , но сохраните Process, возвращенный из ProcessBuilder.start(), и вызовите его метод destroy() в своем методе @AfterClass.

package com.example.demo;

import java.util.ArrayList;
import org.junit.jupiter.api.*;

public class DemoApplicationTests {
    private static Process process;

    @BeforeAll
    public static void beforeClass() throws Exception {
        ArrayList<String> command = new ArrayList<String>();
        command.add(System.getProperty("java.home") + "/bin/java"); // quick and dirty for unix
        command.add("-cp");
        command.add(System.getProperty("java.class.path"));
        command.add(DemoApplication.class.getName());

        ProcessBuilder builder = new ProcessBuilder(command);
        process = builder.inheritIO().start();
    }

    @Test
    void whatever() {
        // ...
    }

    @AfterAll
    public static void afterClass() {
        process.destroy();  
    }
}
...