我开始尝试一些测试驱动的开发实践,并且在决定是否以及如果是的话如何测试我的这段代码时遇到问题。
我有一个类AbstractServer
其中包含 ServerSocketFactory
和ServerSocket
:
public abstract class AbstractServer extends Thread {
...SNIP...
//ServerSocket and factory.
private ServerSocket ss;
private ServerSocketFactory ssf;
public AbstractServer ( int _port ) {
this.port = _port;
try {
ssf = ServerSocketFactory.getDefault();
ss = ssf.createServerSocket(port);
} catch (IOException e) {
// Couldn't create ServerSocket, die.
System.exit(1);
}
}
... SNIP ...
两者都是ServerSocket
和 ServerSocketFactory
是 private
,并且永远不会暴露在此类之外。
我的问题:
我是否应该创建测试来检查我是否实际创建了
ServerSocket
和ServerSocketFactory
?他们是private
并且没有从类(class)内部暴露 - 多少测试算太多测试?如果我应该测试它们的创建,那么如何从类外部测试私有(private)、非公开(无 getter 方法)对象的创建?我天真的(读:未经测试)假设是我会创建一个测试类
extending
AbstractServer
;然后我必须制作我正在测试的东西protected
,这半违背了制作它们的目的private
首先。
最佳答案
首先,单元测试时不要考虑类的内部细节。对于您的单元测试,被测试的类是一个黑匣子。您没有关于其内部结构的信息。这就是单元测试的想法。
现在,问自己一个问题:您的类公开的功能是什么?根据您的示例,它创建一个服务器套接字并开始监听它。现在使用单元测试作为指定此功能的方法(伪代码):
int port = 12345;
AbstractServer server = new AbstractServer(port) { };
new Socket("localhost", port);
就是这样。该测试解释了您的类(class)如何运作以及它的作用。当/如果该类停止提供该功能时 - 测试将失败并指示您。这正是测试的目的。
关于java - 设计套接字创建测试,TDD Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217624/