【发布时间】:2015-06-11 23:52:56
【问题描述】:
我被要求为 Listener.class 编写一个 junit 测试用例。目录的侦听器池和 如果有任何请求,请求就会得到处理。
我遇到的问题是
- Listener.class 中的许多方法是私有的或受保护的。
- Listener 是一个线程,它不会像那样启动。在侦听器开始初始化之前执行许多其他任务。
到目前为止的进展:
我面临的另一个问题是在侦听器类内部,如果调用一个方法,它会在内部调用另一个方法,该方法将使用一些私有或受保护的实例字段,并且这些字段值由另一个类设置。
在搜索了许多博客并查看了许多问题后,我得出一个结论,即我们需要编写一个以前称为类的模拟并模仿这些行为。 我通过创建一个新类开始创建模拟类,该类在侦听器启动之前执行任务。现在我的前辈告诉我这不是继续的方法,我所做的只是创建一个新服务器,这些代码没有经过测试。
那么我该如何测试代码呢?
我的程序流程是这样的。
- ServerConfiguration.class -> 检查系统配置的地方,jav-verion 等
- 读取 Server.xml
- ServerService.class -> 列出所有侦听器、适配器并将它们存储在哈希映射中,配置侦听器和适配器的端口
- Serverservice.class-> 现在仅启动那些在 .xml 中标记为活动的侦听器。
在我的例子中,监听器是可运行的接口。并且它们被一个线程实例化,
请给我您的意见。
更新
现在我的问题是,如何为方法运行测试用例,当它使用超类的变量时。当我运行测试用例时,它总是会失败,因为这些值没有初始化。接下来我该如何进行?
private boolean params()
{
String integrity = "";
String sWAnswer = "";
try
{
try
{
integrity = super.getParam("CHECK_INTEGRITY");
sWAnswer = super.getParam("WRITE_ANSWER");
**Some Business Logic**
super.info("Request Directory : " + sRequestPath);
super.info("Response Directory : " + sResponsePath);
super.info("Error Directory : " + sErrorPath);
}
}
catch (Exception ex)
{
bCheck = false;
}
return bCheck;
}
【问题讨论】:
-
听起来您正在测试的代码需要重构以启用单元测试。但是,在这样做之前,最好确保围绕您正在重构的代码进行足够的集成测试,这样您就会知道您的重构是否会破坏某些东西。阅读 Michael Feathers 的 Working Effectively with Legacy Code,了解有关如何测试此类代码的更多详细信息