Java 在JUnit测试之前,我应该如何启动服务器?

Java 在JUnit测试之前,我应该如何启动服务器?,java,multithreading,unit-testing,junit,server,Java,Multithreading,Unit Testing,Junit,Server,基本上,我在这里对我的服务器进行了JUnit测试: @Test public void test() throws UnknownHostException, IOException, ClassNotFoundException { Socket socket = new Socket("localhost", 4444); PrintWriter stringOut = new PrintWriter(socket.getOutputStream(), true);

基本上,我在这里对我的服务器进行了JUnit测试:

@Test
public void test() throws UnknownHostException, IOException, ClassNotFoundException
{
    Socket socket = new Socket("localhost", 4444);
    PrintWriter stringOut = new PrintWriter(socket.getOutputStream(), true);
    ObjectInputStream oIn = new ObjectInputStream(socket.getInputStream());

    stringOut.println("getMyString");
    String myString = (String) oIn.readObject();
    assertEquals("myString", myString);
    socket.close();
}

但是每次我想运行这个测试时,我都需要启动服务器。我应该如何让它自动启动(当然它必须在另一个线程中)

使用ProcessBuilder启动进程,然后使用destroy()销毁它

ProcessBuilder pb = new ProcessBuilder("/path/to/java", "-jar", "your.jar");
pb.directory(new File("preferred/working/directory"));
Process p = pb.start();
Thread.sleep(1000);

// test here

p.destroy()

技术上的答案可能是将该
套接字
作为测试类中的字段,然后使用
@BeforeAll public static void setUp()
方法创建所需的对象一次。或者在每个测试用例之前启动服务器的
@Before public void setUp()
。当然,您需要匹配的
@毕竟
resp
@After
方法。正如另一个答案所概述的,您可以使用ProcessBuilder来启动一个完全自己的流程

但是,“真正的”单元测试应该只依赖于您的源代码。像这里这样的依赖关系要求外部组件/服务可用,而不是呈现这些功能测试或集成测试

因此,真正的答案是:退后一步。查看服务器代码,问问自己是否真的需要运行整个服务器来测试其各个部分

意思:最后,“服务器”就是让一些“业务逻辑”对外部世界可用。这是两个不同的问题,应该以不同的方式加以解决

因此:您可以为业务逻辑编写单元测试,在没有任何服务器的情况下都可以很好地进行测试。然后编写更多的集成测试,测试服务器是否与业务逻辑部分正确“耦合”


换句话说:假设您的服务器提供3个不同的服务,每个服务都有多个参数和执行的“路径”。您绝对不会通过您的服务器来测试所有这些服务,以及所有参数变化和所有“路径”。相反,您可以编写代码,这样就可以完全测试每个服务,而无需为每个测试启动服务器。然后,当所有这些都起作用时,您将编写一些测试,以确保可以使用服务器调用每个服务(在那里,您将重点放在非常不同的方面,例如:“传递给服务的参数是否显示*内部”,或“服务器是否按预期处理了业务逻辑中的错误”).

服务器似乎是测试设置的一部分。。。你没有安装方法吗?@deHaar服务器有一个主方法你可以从测试代码启动它,还是必须启动一个外部的.exe或.jar才能运行服务器?我可以从一个jar启动服务器,或者只使用eclipse run,然后在运行jar之前写一个
@beforeal
方法。。。使用
ProcessBuilder
可能。。。如果必要的话,编写另一个方法在测试后停止服务器。是的,我已经为服务器业务逻辑编写了单元测试。我只想通过发送一个请求来测试服务器是否能够正常工作。我使用processbuilder来启动jar。但我必须记住每次都要导出它……有没有办法不必每次都导出罐子?你说的“导出”罐子是什么意思?正如a在我的回答中所说:当测试类开始运行时,您可以这样做一次。每次运行测试时,我都必须导出服务器jar。