Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java的真实TDD帮助_Java_Tdd - Fatal编程技术网

使用Java的真实TDD帮助

使用Java的真实TDD帮助,java,tdd,Java,Tdd,我现在正在寻求帮助,以便将TDD用于一个真实世界的示例。大多数演示都过于简单,并没有真正展示如何测试和重新考虑更复杂的类。下面是一个同时使用线程和网络套接字的代码示例。有人能解释一下如何为这样一个类创建一个独立的单元测试吗?谢谢 public class BaseHandler extends Thread { protected Socket mClientSocket; protected BufferedReader is = null; protected Buffered

我现在正在寻求帮助,以便将TDD用于一个真实世界的示例。大多数演示都过于简单,并没有真正展示如何测试和重新考虑更复杂的类。下面是一个同时使用线程和网络套接字的代码示例。有人能解释一下如何为这样一个类创建一个独立的单元测试吗?谢谢

public class BaseHandler  extends Thread {
  protected Socket mClientSocket;
  protected BufferedReader is = null;
  protected BufferedWriter os = null;
  private Logger mLogger = Logger.getLogger(WebTestController.class.getName());
  protected WebTestController mWebTestController;

  /*********************************************************************
   * 
   * @param piPort - int port to listen on
   */
  public BaseHandler(){
  }


  /*********************************************************************** cleanup
   * Ensure sockets are closed as to not run into bind errors
   */
  protected void cleanup() {
    try {
      if (is != null)
        is.close();
      if (os != null)
        os.close();
      if (mClientSocket != null)
        mClientSocket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    mLogger.info("cleaning up a socket");
  }

  /***********************************************************************************
   * Sends a message to the current socket
   * @param pMessage
   */
  protected void writeToSocket(String pMessage){
      try {
          os = new BufferedWriter(
            new OutputStreamWriter(mClientSocket.getOutputStream()));

        }
        catch (IOException e) {
          e.printStackTrace();
          cleanup();
          return;
        }
        try {
            os.write(pMessage, 0, pMessage.length());
            os.flush();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        cleanup();
  }

}

好的,您应该从试驾开发中的测试用例开始。我建议您从这个类应该首先通过的测试开始,并将其视为一个原型


您必须创建一个类或子类,该类或子类将打开虚拟ServerSocket的套接字并向其发送消息。

不要创建此类类

最好将逻辑分为IO相关部分和并发相关部分。然后可以测试IO相关部分,例如,使用模拟套接字实现


不过,测试并发相关逻辑将更加复杂。这取决于您想要实现的行为。

以下是一些可以减少测试问题的实际操作:

  • 不要让你的类继承线程。将其改为可运行,因为您可以单独测试可运行
  • 使用,以便可以使用测试版本替换记录器和WebTestController(请参阅“模拟”)
  • 从代码中删除尚未执行任何操作的内容。然后测试你有什么。只有当您所实现的一切都正常工作并且有有效的测试来证明它时,才能添加新内容
  • 然而,我强烈建议阅读一本关于TDD和单元测试的好书。简单的教程就是这么简单。它们不包括你在现实生活中遇到的复杂情况。在现实生活中使用TDD是完全可能的,但它确实需要一些知识——就像编程一样。

    代码没有“使用”线程,它只是从
    java.lang.thread
    派生的类。在测试类而不是
    java.lang.Thread
    中的功能之后,没有任何东西可以阻止您直接调用
    run()
    方法

    事实上,您想要测试
    cleanup()
    writeToSocket
    方法,因此也不需要调用
    run()
    方法

    只需创建一个子类
    BaseHandler
    ,用一些模拟对象初始化该子类中的成员,就可以了


    不过,您可能需要进行其他更改,以使其余代码更易于测试。我假设这个问题更多的是关于对现有代码库进行单元测试,而不是关于TDD。

    这个类不尊重SRP(单一责任原则)。你的课逻辑性太强了。 相反,您应该将该类拆分为多个较小的类。然后通常使用Spring或其他IoC框架注入这些类


    如果您要拆分类,您会注意到它将更容易测试。您可以为这些组件提供模拟对象,并在每个测试用例中按照您的意愿注入它们,因为它最适合您。

    您仍然需要进行设计,在您知道要编写哪些类和方法之前,您甚至无法编写测试:因此,这个建议并不能真正让您了解OP询问TDD的任何地方。如果不完成测试,就无法完成设计,因此我认为您的区别与TDD无关。在TDD中,在编写测试之前,您必须决定要测试什么。即使以迭代方式使用TDD,您也必须在编写测试之前确定要创建的第一个类和第一个方法,否则测试将调用什么?在TDD中,设计和测试是第一阶段的一部分。“首先,开发人员编写了一个失败的自动测试用例,定义了所需的改进或新功能。”在此之前,没有单独的设计阶段。该类甚至不必是可运行的,该类的许多特性都不起任何作用。我仍然建议他从一个他希望工作的简单测试用例开始,从头开始类,只添加通过测试所需的代码。+1:虽然我只会使用一个真正的套接字,而不是一个模拟的套接字。+1:
    run()这两者都是因为我需要调整我的思维和开发风格来使用TDD。我提出这个问题是为了了解如何基于我目前的工作。