2

我正在用 Java 编写一个套接字应用程序,其中服务器从事件源获取消息并向连接的用户发送通知,具体取决于事件类型。

现在我要为服务器编写一些 JUnit 测试... JUnit(在 eclipse 中自动建议)来实现对所有公共方法的测试,我看到了它的必要性。服务器类有一个公共方法 bufferEvent...,但是事件在私有方法中处理,甚至没有一个方法返回缓冲消息的数量。

所以服务器没有公共方法来验证结果。

我认为这个问题可以概括:如何测试公共方法,结果无法用公共方法验证(没有 getter 等)

我想避免仅仅为了测试而编写额外的方法。是否有解决方法或最佳实践来测试这些东西?

提前致谢

4

3 回答 3

2

您应该创建一个构造函数,允许您为协作者插入模拟或间谍。

例如,您的服务器将有一个构造函数Server(List<Buffer> buffer)。仅用于测试。然后您可以在单元测试中添加缓冲区,并断言对该缓冲区进行了修改。

List 很容易替换为您在测试中创建的对象。如果你想要更高级的东西,看看像Mockito这样的模拟框架。

例如,您为 Socket 创建一个模拟。你会得到Socket = mock(Socket.class. 你在构造函数中插入Server(List<Buffer> buffer, Socket socket)。然后,在您调用了要测试的任何函数之后,您可以使用例如verify(socket).send("yourMessage")查看服务器是否使用send带有参数“yourMessage”的方法来验证行为。

例如,此类在其构造Plugins函数中需要一些插件。为了测试它,在这个测试类中创建、插入然后验证模拟,如下verify(proxyServerPlugin).proxyServer(config);所示:

有关更多示例,请参见Mockito

于 2013-03-27T14:02:26.723 回答
1

您可以检查负面测试用例。服务没有返回,但可能存在服务引发的异常:

@Test
public void testServerService(){
try{
   myServer.service();
   Assert.assertTrue(true);
}catch(Exception ex){
   Assert.fail("anything goes wrong");
}
}

否则在这种情况下我会写这样的东西:

@Test
public void testServerService(){
   myServer.service();
   Assert.assertTrue(true);
}

所以我至少有断言来检查进程是否运行没有问题。

顺便说一句,我认为你是对的。编写新功能只是为了验证 Junit 测试用例是非常糟糕的做法。

于 2013-03-27T13:19:35.653 回答
0

考虑添加一个 Logger,它有自己的 Level TEST ,在方法的末尾记录重要的值,并有一个流到 A 测试类。

于 2013-03-28T13:16:34.430 回答