[英]Spring Boot console application causes JUnit test case to wait
我有接受用戶輸入的 Spring 引導控制台應用程序。 在同一個應用程序中,有一些服務來執行一些邏輯。
在直接運行服務的 JUnit 測試用例時,我觀察到控制台應用程序停留在接受用戶輸入的 state 中的行為,因此沒有進入 Z8965A291ED0E84870298E1C35DD61A 測試。
通常沒有問題,因為對於正常的 Spring 引導應用程序,啟動時沒有什么可以運行的。 但是對於這個控制台應用程序設置,它等待用戶輸入。
我可以知道是否有任何方法可以使測試用例在不觸發控制台應用程序的情況下運行? 非常感謝。
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.