2013-02-14 41 views
1

我開始使用FEST來幫助我在Java Swing GUI上執行單元測試。FEST:如何正確使用NoExitSecurityManager?

現在,我設法通過了文檔(大部分已棄用),並通過查看Javadoc和代碼來幫助我。

現在我在使用NoExitSecurityManager時遇到問題。 documentation已經過時了,但我們可以理解它的大部分內容。

我只是試着測試我的「Quit」MenuItem在我的GUI中是否工作正常。所以,我需要阻止System.exit(0)並將程序的退出狀態映射到JUnit測試。

這裏是我用來執行測試的簡化代碼(被測試的類是GraphicalUserInterface)。

import org.junit.Test; 
import org.junit.AfterClass; 
import org.junit.BeforeClass; 

import org.fest.swing.annotation.RunsInEDT; 
import org.fest.swing.edt.GuiQuery; 
import org.fest.swing.edt.GuiActionRunner; 
import org.fest.swing.fixture.FrameFixture; 
import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; 
import org.fest.swing.security.NoExitSecurityManagerInstaller; 


public class GraphicalUserInterfaceTest extends FestSwingJUnitTestCase { 

    private static FrameFixture gui; 
    private static NoExitSecurityManagerInstaller noExitSecurityManagerInstaller; 

    @BeforeClass 
    public static void setUpBeforeClass() throws Exception { 
      NoExitSecurityManagerInstaller.installNoExitSecurityManager(new ExpectExitSuccess()); 
    } 

    @AfterClass 
    public static void tearDownAfterClass() throws Exception { 
      noExitSecurityManagerInstaller.uninstall(); 
    } 

    @Override 
    protected void onSetUp() { 
      gui = new FrameFixture(robot(), createNewGUI()); 
      gui.show(); 
    } 

    @RunsInEDT 
    private GraphicalUserInterface createNewGUI() { 
      return GuiActionRunner.execute(new GuiQuery<GraphicalUserInterface>() { 
        protected GraphicalUserInterface executeInEDT() { 
         return new GraphicalUserInterface(); 
        } 
     }); 
    } 

    @Test 
    public final void testFileMenuQuitMenuItem() { 
      gui.menuItemWithPath("File", "Quit").click(); 
    } 

} 

ExitCallHook被編碼像這樣(你可以悠然自得地在另一個)。

import static org.junit.Assert.assertTrue; 

import org.fest.swing.security.ExitCallHook; 

public final class ExpectExitSuccess implements ExitCallHook { 

    @Override 
    public void exitCalled(int status) { 
      assertTrue(status == 0); 
    } 
} 

所有的測試都執行得很好,除了在最後得到一個java.lang.NullPointerException之外,所有的測試都很好。

所以,我想知道我做了什麼錯誤的(或者我可以改進以在測試結束時不會得到這個空指針異常)。

回答

1

我在代碼中找到了解決方案。實際上,正確的做法如下:

@Test 
public final void testFileMenuQuitMenuItem() { 
    NoExitSecurityManagerInstaller noExitSecurityManagerInstaller = 
     NoExitSecurityManagerInstaller.installNoExitSecurityManager(new ExpectExitSuccess()); 

    gui.menuItemWithPath("File", "Quit").click(); 

    noExitSecurityManagerInstaller.uninstall(); 
} 

這樣可以防止污染每個測試與NoExitSecurityManager。