使用Java的真实TDD帮助
我现在正在寻求帮助,以便将TDD用于一个真实世界的示例。大多数演示都过于简单,并没有真正展示如何测试和重新考虑更复杂的类。下面是一个同时使用线程和网络套接字的代码示例。有人能解释一下如何为这样一个类创建一个独立的单元测试吗?谢谢使用Java的真实TDD帮助,java,tdd,Java,Tdd,我现在正在寻求帮助,以便将TDD用于一个真实世界的示例。大多数演示都过于简单,并没有真正展示如何测试和重新考虑更复杂的类。下面是一个同时使用线程和网络套接字的代码示例。有人能解释一下如何为这样一个类创建一个独立的单元测试吗?谢谢 public class BaseHandler extends Thread { protected Socket mClientSocket; protected BufferedReader is = null; protected Buffered
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相关部分,例如,使用模拟套接字实现
不过,测试并发相关逻辑将更加复杂。这取决于您想要实现的行为。以下是一些可以减少测试问题的实际操作:
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。我提出这个问题是为了了解如何基于我目前的工作。