java - 设计套接字创建测试,TDD Java

标签 java unit-testing tdd

我开始尝试一些测试驱动的开发实践,并且在决定是否以及如果是的话如何测试我的这段代码时遇到问题。

我有一个类AbstractServer其中包含 ServerSocketFactoryServerSocket :


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 ...

两者都是ServerSocketServerSocketFactoryprivate ,并且永远不会暴露在此类之外。

我的问题:

  1. 我是否应该创建测试来检查我是否实际创建了 ServerSocketServerSocketFactory ?他们是private并且没有从类(class)内部暴露 - 多少测试算太多测试?

  2. 如果我应该测试它们的创建,那么如何从类外部测试私有(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/

相关文章:

java 使用外部 list 文件运行 jar

unit-testing - GoogleTest中有没有类似于Igloo的LastException的东西?

visual-studio-2008 - 为 Visual Studio 2008 推荐的 TDD/Agile/Source Control 插件

java - 如何在 Socket 上设置写入超时

java - FlyWay 迁移脚本

java - 如何在 Exoplayer android 中向视频添加字幕(.SRT 文件)?

c++ - CMake:尝试将链接库添加到未在此目录中构建的目标

python - 测试 Python 脚本

iphone - 单元测试和 TDD、OCUnit 与 Google Tool Box

c# - TDD 和继承