【发布时间】:2017-10-02 07:39:35
【问题描述】:
我正在开发一个简单的客户端-服务器应用程序,我应该在不同的线程中初始化我的客户端和服务器对象。服务器包含我大学某些特定部门的所有课程的数据库,GET 请求获取请求部门中的所有课程并将其发送回客户端。虽然我能够在 main 方法中完美地测试所有内容,但单元测试却无法正常工作。下面是我的单元测试代码:
import client.Client;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import server.Server;
public class ClientServerTest {
private static String file = "";
@BeforeClass
public static void setFile(){
file = System.getProperty("file");
}
@Before
public void startServerTest(){
Thread serverThread = new Thread(() -> {
new Server(file);
});
serverThread.start();
}
@Test
public void getTest(){
Client client = new Client();
Assert.assertTrue(client.submitRequest("GET COM"));
Assert.assertTrue(client.submitRequest("GET MAT"));
Assert.assertTrue(client.submitRequest("GET BIO"))
}
}
当我运行测试时,服务器测试通过,getTest() 测试得到以下输出:
java.net.ConnectException: Connection refused: connect
我一直在四处寻找让单元测试与线程一起工作的最佳方法,但我似乎无法弄清楚。任何帮助将不胜感激。
【问题讨论】:
-
很难说没有看到这些类的实现 - 但在每次测试后停止服务器可能会有所帮助。
-
serverThread 是局部变量,很可能在事件执行“新服务器(文件)”之前就被释放了
-
首先:这远非单元测试。您正在测试整个系统,而不仅仅是一个代码单元。现在,问题可能是您在启动服务器线程后立即尝试连接到服务器。此时,你无法保证服务器线程正在执行并监听其套接字,因为测试线程和服务器线程同时运行,并且 Thread.start() 不会等待服务器真正启动。跨度>
-
我遇到了“new Server(file);”的问题,是阻塞调用吗?关闭服务器是什么意思?
-
serverThread应声明为数据成员,并在每次测试之前/之后 (@After) 开始/停止。
标签: java multithreading sockets junit