簡體   English   中英

Spring 引導控制台應用程序導致 JUnit 測試用例等待

[英]Spring Boot console application causes JUnit test case to wait

我有接受用戶輸入的 Spring 引導控制台應用程序。 在同一個應用程序中,有一些服務來執行一些邏輯。

在直接運行服務的 JUnit 測試用例時,我觀察到控制台應用程序停留在接受用戶輸入的 state 中的行為,因此沒有進入 Z8965A291ED0E84870298E1C35DD61A 測試。

通常沒有問題,因為對於正常的 Spring 引導應用程序,啟動時沒有什么可以運行的。 但是對於這個控制台應用程序設置,它等待用戶輸入。

我可以知道是否有任何方法可以使測試用例在不觸發控制台應用程序的情況下運行? 非常感謝。

觀察:在 JUnit 測試用例運行時觸發控制台應用程序,未進入測試用例

在此處輸入圖像描述

主要應用

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ToyRobotApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ToyRobotApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // Instruct user to perform input
        System.out.println("Welcome to toy robot application!");
        System.out.println("Below are the possible operations:");
        System.out.println("PLACE <x-coordinate> <y-coordinate> <facing>");
        System.out.println("MOVE");
        System.out.println("LEFT");
        System.out.println("RIGHT");
        System.out.println("REPORT");

        while (true) {
            System.out.println("Please enter your command:");

            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String usrInput = br.readLine();
            //...

        }
    }
}

測試用例

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

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.somecompany.model.Facing;
import com.somecompany.model.Location;
import com.somecompany.model.Robot;
import com.somecompany.service.ToyRobotService;

@SpringBootTest
public class ToyRobotReportTest {

    @Autowired
    private Robot robot;

    @Autowired
    private ToyRobotService toyRobotService;

    @Test
    public void shouldBeAbleToReportLocation() {
        Location location = new Location();
        location.setXCor("1");
        location.setYCor("2");
        location.setFacing(Facing.NORTH);

        robot.setLocation(location);

        // Actual result
        String result = toyRobotService.report();

        // Assertion
        assertEquals("1,2,NORTH", result);
    }
}

注:其他來源省略

經過一番研究,我得到了設置工作。 為了使它工作,JUnit 測試 class 不應使用通常的 @SpringBootTest 注釋進行注釋。

當 class 用@SpringBootTest 注解時,它將啟動應用程序的上下文(即啟動應用程序)。 在大多數常見的測試場景中,如果沒有等待用戶輸入,這應該沒問題。

在我們的例子中,我們希望 Spring 引導注釋(例如@Autowired)被識別,但不希望應用程序本身被啟動。

我們可以在 JUnit 中使用以下內容:

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = ToyRobotApplication.class, initializers = ConfigDataApplicationContextInitializer.class)
public class ToyRobotPlaceTest {
    ...
}

這將 regonize spring 注釋,但不會啟動應用程序上下文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM