JUnit和Netty导致应用程序过早结束

时间:2013-05-29 20:30:56

标签: java multithreading junit netty

注意:我使用的是JUnit 4.11和Netty 3.6.5。

我正在尝试在我复杂的服务器应用程序中测试一些基本功能。我想简单地提取网络功能并进行一些单元测试。但是,当我尝试创建单元测试时,应用程序只是退出。但是,如果我放置一个虚拟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();
    }
}

1 个答案:

答案 0 :(得分:4)

一旦junit线程完成,Junit将退出测试,而main将等待非守护进程线程在退出之前终止。您需要暂停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,但它应该是这样的)