2013-05-29 42 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

相关问题