2013-05-29 45 views
5

注意:我正在使用JUnit 4.11和Netty 3.6.5。JUnit和Netty導致應用程序提前終止

我想在我複雜的服務器應用程序中測試一些基本功能。我想簡單地提取網絡功能並做一些單元測試。但是,當我嘗試創建單元測試時,應用程序會退出。但是,如果我放了一個虛擬public static void main,它顯然可以正常工作,但在JUnit之外。這裏的sscce

public class SimpleNetwork { 
    private Injector inj; 

    @Before 
    public void startInjector() { 
     Module mod = new AbstractModule() { 
      @Override 
      protected void configure() { 
       // Guice stuff you don't need to see, it works fine 
      } 
     }; 
     inj = Guice.createInjector(mod); 
    } 

    // **When I run this using JUnit, the application ends immediately.** 
    @Test 
    public void testNetwork() { 
     NioServer server = inj.getInstance(NioServer.class); 
     server.run(); 

     // **This prints in both scenarios** 
     System.out.println("Hello World"); 
    } 

    // **When I run this, the application works as expected.** 
    public static void main(String[] args) { 
     SimpleNetwork sn = new SimpleNetwork(); 

     sn.startInjector(); 
     sn.testNetwork(); 
    } 
} 
+0

你可以調試到NioServer? – fge

+0

@fge是的,'run'方法有一個調試'println'發生 – durron597

+2

Netty stuff是* asynchronous *,測試運行器不會等待其他線程完成,你必須在你的測試方法中安排它。 –

回答

4

JUnit會盡快退出測試作爲JUnit的線程完成,而你的主會等非守護線程退出之前終止。您需要暫停junit線程並等待發生的任何事件。

目前還不清楚你試圖測試什麼。

  • 如果您只需測試您的服務器是否可以啓動,那麼您當前的測試就是這樣做的。特別是,您提供的鏈接顯示的是在後臺線程中運行的服務器,因此run方法會立即返回。所以你的測試檢查run方法返回沒有問題。
  • 如果您想通過發送數據並檢查收到的內容(例如)來實際運用您的服務器。在這種情況下,您需要在相同的測試方法中包含測試服務器的代碼。

整個測試類測試類似的東西是開始了一次服務器的一個比較典型的方式:

private NioServer server; 
@BeforeClass 
public void beforeClass() { 
    server = getServer(); 
    server.run(); 
} 

@Test 
public void testOne() { 
    sendSomeDataToServer("data"); 
    assertEquals("data", server.getLastReceivedData()); 
} 

(我不是100%地肯定了JUnit的語法,我使用TestNG的但它應該是這樣的)

+0

該課程是服務器測試環境的一部分。你是說,在'@ BeforeClass'中啓動服務器,然後建立一些客戶端連接? – durron597

+0

@ durron597這是一種方法。另一種方法是使用模擬對象。你究竟想要測試什麼?你什麼時候期望測試通過或失敗?如果你澄清說它會更容易幫助你。 – assylias

+0

呵呵。問這個問題讓我懷疑我的方法是否試圖一次覆蓋太多的代碼。我開始輸入「確保服務器正確地構造和解構對象」,除了爲什麼我不直接測試編碼器? – durron597

相關問題