2012-06-27 12 views
2

我开始使用一些测试驱动的开发实践,并且在决定是否以及如何测试我的代码这一部分时遇到问题。设计套接字创建测试,TDD Java

我有一个类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而不是从课堂内暴露 - 多少测试是太多测试?

  2. 如果测试他们的创作是我应该做的,我怎么测试从类的外部私人,非暴露(没有getter方法)创建对象?我的天真(阅读:未经测试)的假设是,我会创建一个测试类extendingAbstractServer;然后,我必须做出我正在测试的东西protected,这半开始使它们成为private

+1

迂腐:如果你在上课/课后写测试,那不是真正的TDD。 – millimoose

+0

@millimoose几年前,我写了一门课,作为一个家庭作业项目。我正在用一些增强功能和GUI来重写它,以便与Swing一起玩。我知道我是如何实现它的,因为我有旧的代码,但我在(重新)实现之前正在执行测试;) – simont

回答

1

首先,不考虑单元测试过程中的类的内部细节。对于你的单元测试,被测试的类是一个黑盒子。你没有关于其内部结构的信息。这就是单元测试的想法。

现在,问自己一个问题:你的类正在暴露什么功能?根据你的例子,它创建一个服务器套接字并开始收听。现在使用单元测试作为指定此功能的一种方式(伪代码):

int port = 12345; 
AbstractServer server = new AbstractServer(port) { }; 
new Socket("localhost", port); 

就是这样。这个测试解释了你的班级是如何工作的以及它的作用。当/如果班级停止提供该功能 - 测试将失败并向您显示。这正是测试的目的。

0

你并不需要特别测试这个简单的构造函数。只有两个电话 - 这两个电话都是可公开访问的方法,并且可以进行测试以确保它们以自己的方式工作。即使在更复杂的构造函数情况下,也应该使用可测试的构建器模式。

至于有多少是太多了,我有时可能最终松开封装有点刁难测试更容易,但它确实取决于实际情况。一般来说,只要你彻底地测试你的公共API,你就可以确信模块中的所有代码都能正常工作 - 如果公共API完全工作,那么私有代码就不会出现任何问题。

这里是一些强硬的地区在TDD像样的文章涵盖:here

1
  1. 我不写单元测试用于填充类变量,这是太微不足道了,在我看来,不需要测试。我编写单元测试来测试例程。例如,为了确保我的add()方法实际上添加了,并且我的remove()方法实际上删除了(正确的对象)。如果这些类变量出于某种原因或者没有正确实例化的原因,那么我的功能测试会抓住这个。
  2. 至于测试private变量/类,我会建议看看下面的答案:https://stackoverflow.com/a/7075965/1201423。其背后的基本概念是:如果它是private,并且您需要测试它,它应该真的是private
0

首先测试抽象类不是一个好主意。你应该测试具体的实现。抽象类只是一种消除代码重复的方法(通过IS-A关系),您可以通过许多其他方式(例如我更喜欢的是HAS-A关系)来消除重复。

看着你的代码和你的问题一个好的首发你可能是这个视频: How to Write Clean, Testable Code 它会告诉你为什么你采取的方法可能不是一个好主意,并会指出你的一些样本解决方案。

通常:指定您班级提供的场景/功能。不要测试实施细节。

初学者知识的好来源是:Test Driven Development Blog。看看那里的旧帖子。

编辑: 如果你想测试遗留代码,那么也有模式。在这种情况下,一般规则是从接受开始,而不是单元测试。