我有一个服务器客户端项目,出于测试目的,我想在一个全新的进程中启动服务器。问题是,我的项目中只有一个 main() 方法,没有 jar。所以我的猜测是这样的
Runtime.getRuntime().exec("javac MyServer.java");
Runtime.getRuntime().exec("java class MyServer");
但我真的不确定这一点,而且我也不完全喜欢为每个测试用例启动 javac 的需要。
我该如何进行?
编辑
我想在
@Before
方法中启动进程并在 @After
中销毁它。它必须自动运行,因此手动打开服务器不是一个选择。我正在寻找一种消除服务器类编译的方法。但现在我想没有其他办法了。
如果这是出于测试目的,只需从命令行启动其他进程或使用 Eclipse 来处理它。在 Eclipse 中,同一个项目可以有多个 main() 入口点。当您希望运行应用程序时,您可以创建一个运行/调试配置,说明您希望调用哪个入口点。因此,您可以为客户端定义一个,为服务器定义一个,然后单击按钮即可运行它们。
扩展:
先决条件 - 在执行任何操作之前,先将您的项目导入 Eclipse。
Eclipse 还有一个调试视角,您可以在其中停止/暂停正在运行的进程、设置断点等等。它甚至可以同时调试多个事物,因此您可以在调试中启动客户端和服务器,并在调用的任一侧设置断点。
Java 允许您像这样进行系统调用。
Runtime r = Runtime.getRuntime();
Process p = r.exec("java otherMain arg0 arg1");
这将允许您启动另一个 java 进程。如果需要,进程还具有获取该进程的输出的方法。
看看JUnit,我认为您想要做的是在服务器运行的情况下针对您的客户端运行一系列测试。 您可以通过编写 JUnit 测试来实现此目的,该测试使用 @Before 注释在每次测试之前运行设置方法。 例如:
import org.junit.Before
public class TestClient {
private static final int port = 20000 + new Random().nextInt(10000);
private MyServer server;
@Before
public void setup() {
// setup server
server = new MyServer(port);
server.start();
}
@Test
public void testX() {
// test x
}
@Test
public void testY() {
// test y
}
}