Java:如何測(cè)試調(diào)用System.exit()的方法?我有一些方法可以調(diào)用System.exit()某些輸入。不幸的是,測(cè)試這些情況會(huì)導(dǎo)致JUnit終止!將方法調(diào)用放在新線程中似乎沒有幫助,因?yàn)镾ystem.exit()終止JVM,而不僅僅是當(dāng)前線程。是否有任何常見的處理方式?例如,我可以替換存根System.exit()嗎?[編輯]有問題的類實(shí)際上是一個(gè)命令行工具,我試圖在JUnit中測(cè)試。也許JUnit根本不適合這份工作?建議使用補(bǔ)充回歸測(cè)試工具(最好是與JUnit和EclEmma完美集成的東西)。
3 回答

qq_遁去的一_1
TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
庫系統(tǒng)規(guī)則庫有一個(gè)名為ExpectedSystemExit的JUnit規(guī)則。使用此規(guī)則,您可以測(cè)試調(diào)用System.exit(...)的代碼:
public void MyTest { @Rule public final ExpectedSystemExit exit = ExpectedSystemExit.none(); @Test public void systemExitWithArbitraryStatusCode() { exit.expectSystemExit(); //the code under test, which calls System.exit(...); } @Test public void systemExitWithSelectedStatusCode0() { exit.expectSystemExitWithStatus(0); //the code under test, which calls System.exit(0); }}
完全披露:我是該圖書館的作者。

牧羊人nacy
TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
實(shí)際上,您可以System.exit
在JUnit測(cè)試中模擬或刪除該方法。
例如,您可以使用JMockit編寫(還有其他方法):
@Testpublic void mockSystemExit(@Mocked("exit") System mockSystem){ // Called by code under test: System.exit(); // will not exit the program}
編輯:替代測(cè)試(使用最新的JMockit API),在調(diào)用之后不允許任何代碼運(yùn)行System.exit(n)
:
@Test(expected = EOFException.class)public void checkingForSystemExitWhileNotAllowingCodeToContinueToRun() { new Expectations(System.class) {{ System.exit(anyInt); result = new EOFException(); }}; // From the code under test: System.exit(1); System.out.println("This will never run (and not exit either)");}
添加回答
舉報(bào)
0/150
提交
取消