단위 테스트에서 System.exit() 호출 관리
System.exit()를 호출하는 테스트 메서드는 JUnit 환경에서 문제가 됩니다. System.exit()가 호출되면 테스트 프로세스를 포함하여 JVM(Java Virtual Machine)이 종료됩니다.
일반적인 접근 방식:
NoExitSecurityManager를 사용한 예:
다음 Java 코드는 테스트 중 JVM 종료를 방지하는 사용자 정의 보안 관리자:
public class NoExitTestCase extends TestCase { private static class NoExitSecurityManager extends SecurityManager { @Override public void checkExit(int status) { super.checkExit(status); throw new ExitException(status); } } @Override protected void setUp() throws Exception { super.setUp(); System.setSecurityManager(new NoExitSecurityManager()); } @Override protected void tearDown() throws Exception { System.setSecurityManager(null); super.tearDown(); } public void testNoExit() throws Exception { System.out.println("Printing works"); } public void testExit() throws Exception { try { System.exit(42); } catch (ExitException e) { assertEquals("Exit status", 42, e.status); } } }
시스템 JUnit 4.9 규칙 :
JUnit 4.9 이상에서는 System.exit()를 처리하도록 특별히 설계된 시스템 규칙을 제공합니다. 다음 예에서는 ExpectedSystemExit 규칙을 사용하여 System.exit()가 호출되었는지와 종료 상태를 확인합니다.
public class MyTest { @Rule public final ExpectedSystemExit exit = ExpectedSystemExit.none(); @Test public void noSystemExit() { //passes } @Test public void systemExitWithArbitraryStatusCode() { exit.expectSystemExit(); System.exit(0); } @Test public void systemExitWithSelectedStatusCode0() { exit.expectSystemExitWithStatus(0); System.exit(0); } }
2023 JVM 업데이트:
Java 21 이상에서는 System.exit()가 실행되지 않도록 시스템 속성 -Djava.security.manager=allow를 설정해야 합니다. 테스트 중 JVM을 종료합니다.
위 내용은 JUnit에서 System.exit()를 호출하는 메서드를 테스트하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!