撰写Junit测试用例时遇到的问题

时间:2015-06-11 23:52:57

标签: java junit easymock

我被要求为Listener.class编写一个junit测试用例。监听器池为目录和 如果有任何请求,请求将被处理。

我面临的问题是

  • Listener.class中的许多方法都是私有的或受保护的。
  • 监听器是一个线程,它不会像那样开始。在侦听器开始初始化之前和要执行的许多其他任务之前。

到目前为止的进展:

我面临的另一个问题是在监听器类中如果调用了一个方法,它在内部调用另一个方法,该方法将使用一些私有或受保护的实例字段,并且这些字段值由另一个类设置。

在搜索许多博客并查看许多问题时,我得出结论,我们需要编写一个先前调用的类的模拟并模仿这些行为。 我开始通过创建一个新类来创建mock类,该类在Listener启动之前执行任务。现在,我的老年人告诉它不是继续进行的方式,我正在做的就是创建一个新的服务器并且这些代码没有经过测试。

那我该如何测试代码?

我的程序流程是这样的。

  1. ServerConfiguration.class - >检查系统配置的地方,jav-verion等。
  2. 读取Server.xml
  3. ServerService.class - >制作所有侦听器,适配器的列表并将其存储在哈希映射中,为侦听器和适配器配置端口
  4. Serverservice.class->现在只启动那些在.xml中标记为活动的侦听器。
  5. 在我的情况下,Listeners是可运行的界面。它们由一个线程实例化,

    请给我你的意见。

    更新

    现在我的问题是,当我使用超类变量时,如何运行方法的测试用例。当我运行测试用例时,它总是会失败,因为这些值没有被初始化。我下一步该怎么办?

    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;
          }
    

1 个答案:

答案 0 :(得分:2)

我使用EasyMock已经有一段时间了,但你可能想看看Partial Mocking我也假设“.class”你的意思是“.java”。

我认为潜在的问题是应该设计一个单元测试来测试一个小的代码功能。您所描述的内容听起来像是变成了集成测试。首先,确保您已经定义了您尝试编写的测试类型,两者都可以使用junit框架编写。

通常情况下,您将最小化模拟的使​​用或完全不使用它们进行集成测试,因为您正在测试所有部分是否正确匹配。

对于单元测试,您希望隔离一个业务逻辑并忽略系统的其余部分,这是使用模拟允许您执行的操作。基本思想是使用模拟框架来创建您不关心的所有涉及的类的模拟。

[编辑正确]如果您需要测试的方法是private,如果范围修饰符不必要地严格,则将其范围修饰符更改为protected可能是有意义的。受保护的访问应该为您的测试提供访问权限(因为您的测试应该在与其测试的类相同的包中定义)。

如果您无法更改该特定方法的修饰符,则另一个选项是使用受保护的修饰符提取您需要测试的特定代码到新方法,并直接从您的测试中调用该新方法。

看起来您需要一个ServerConfigurationTest.java类来测试读取非常简化的Server.xml文件,然后验证您是否正确记录了该文件中的数据。

另外,您需要一个ServerServiceTest.java类。您将创建一个模拟ServerServer用于从Server.xml访问数据的任何类(可能是ServerConfiguration)。从他们的文档中查看the behavior page。修改后,你会有类似的东西:

  // create and populate testConfigServersList with test data
  expect(configMock.getActiveServers())
  .andReturn(testConfigServersList);

因为您直接调用该方法,所以不需要“启动”该线程。 junit类已经被执行了。您只是在一些测试对象上设置状态,运行您正在测试的方法,然后以您期望的方式验证状态更改。

然后,您将进行第二次看起来相同的测试,但是您的测试数据只有非活动服务器,那么您将验证没有启动任何服务器。 EasyMock将让您验证类上的方法是否被调用,但实际上并不允许使用名为Partial Mocking的功能运行该方法。因此,您将创建ServerService的部分模拟,并模拟实际启动另一个服务器的方法。如果ServerService有一个巨大的方法从ServerConfiguration读取数据并为每个活动服务器启动一个新服务器,那么您需要重构代码并将新服务器启动提取到单独的方法。