【问题标题】:Why Unit test of WebServer project shows strange behaviour?为什么 WebServer 项目的单元测试显示奇怪的行为?
【发布时间】:2013-05-13 09:10:03
【问题描述】:

我正在编写我的项目 HTTP THREADPOOLED WEB SERVER 的单元测试。为此,我在 Maven 中使用 Junit

同时我卡在一个地方,疑惑如下,

  1. 有一个名为WebServer的类,它的任务是启动服务器,创建线程池,并开始在端口上监听客户端请求。当我为相同的线程创建一个线程时,在注释@BeforeClass 下的测试类中,预计会等待客户端请求,但结果显示测试已完成。

    公共类 WebServerTest {

    @BeforeClass
    public static void webserverStarter() {
        System.out.println("Before Class : webserverStarter");
        new Thread(new WebServer()).start();
    }
    
    @AfterClass
    public static void webserverCleanup() {
        System.out.println("After Class : webserverStarter");
    }
    

    }

我不明白为什么这不等待客户请求。请帮助我编写用于测试 HTTP Threadpooled WebServer 的单元测试。

【问题讨论】:

    标签: multithreading unit-testing maven junit webserver


    【解决方案1】:

    @Before 在每个测试之前执行。如果你想使用一个单一的网络服务器,只需创建一个对象!

    【讨论】:

    • 但是,请问为什么它成功出来了,当在 WebServer Class 中时,有一个无限循环,其中服务器正在接受客户端请求。它不应该从 webserver 类中正常出来。
    • 这是无限循环中的命令client_socket = serversocket.accept();。告诉我如何接受客户请求?有什么方法可以让我用资源文件夹中任何文件的任何其他 InputStream 替换这个套接字。
    【解决方案2】:

    如果您确定 webserverStarter() 确实在启动服务器,那么毫无疑问该服务器将正常工作。不用担心@BeforeClass 注释。这只意味着它只会被调用一次,同样的事情适用于@AfterClass。

    我怀疑的是,如果您的服务器确实已启动,并且您确定它,可能是服务器在启动成功或测试用例成功结束后立即关闭。在使用嵌入式 Tomcat 服务器时,我必须告诉我的服务器像这样连续运行。

    tomcat.start();     
    tomcat.getServer().await();
    

    【讨论】:

    • 你能解释一下最后一行吗?
    • Embedded Tomcat 是一个用于测试的服务器。例如,java.dzone.com/articles/embedded-tomcat-minimaltomcat.start();将启动服务器,但你必须说 tomcat.getServer().await();连续运行。
    • 有一点我想让你清楚的是,我自己做了一个服务器,只是为了学习多线程、socket概念。
    • JUNIT 测试用例设计为不会永远运行。我仍然怀疑在调用 @AfterClass 之后,您的测试用例成功结束,并且它会停止所有内部线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2015-02-03
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多