Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 编写Junit测试用例中的问题_Java_Junit_Easymock - Fatal编程技术网

Java 编写Junit测试用例中的问题

Java 编写Junit测试用例中的问题,java,junit,easymock,Java,Junit,Easymock,我被要求为Listener.class编写一个junit测试用例。侦听器池用于一个目录和 如果有任何请求,请求将得到处理 我面临的问题是 Listener.class中的许多方法是私有的或受保护的 侦听器是一个线程,它不会像这样开始。在侦听器开始初始化和执行许多其他任务之前 迄今为止的进展: 我面临的另一个问题是listener类内部如果调用一个方法,它会在内部调用另一个方法,该方法将使用一些私有或受保护的实例字段,这些字段值由其他类设置 在搜索了许多博客并研究了许多问题后,我得出了一个结论

我被要求为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;
          }
    

    我已经有一段时间没有使用EasyMock了,但您可能还想看看我假设的“.class”是指“.java”

    我认为根本的问题是,应该设计一个单元测试来测试代码的一个小特性。您所描述的内容听起来像是一个集成测试。因此,首先,确保您已经定义了要编写的测试类型,这两种测试都可以使用junit框架编写

    通常,您将最小化模拟的使用,或者根本不在集成测试中使用它们,因为您正在测试所有的部分是否正确地装配在一起

    对于单元测试,您希望隔离一段业务逻辑,而忽略系统的其余部分,这正是使用mock可以做到的。基本思想是使用mock框架创建一个包含所有您不关心的类的mock

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

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

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

    另外,您需要一个ServerServiceTest.java类。您将创建ServerService用于从Server.xml(可能是ServerConfiguration)访问数据的任何类的模拟。查看他们的文档。修改后,您将有如下内容:

      // create and populate testConfigServersList with test data
      expect(configMock.getActiveServers())
      .andReturn(testConfigServersList);
    
    因为您直接调用该方法,所以不需要“启动”线程。junit类已经将被执行。您只是在一些测试对象上设置状态,运行您正在测试的方法,然后验证以您期望的方式更改的状态


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

    受保护的方法也是包范围,因此如果测试类与tedsdt下的代码在同一个包中(但在不同的源树中)测试将能够调用受保护的method@JeffNeet谢谢你的建议。但是现在我陷入了另一个问题,我在我的问题中更新了这个问题。请看一看。@user3473132这部分代码是一个完美的例子,说明了你应该从哪里提取一个方法:一些你不想测试super cl的业务逻辑因此,在与
    params()相同的类中创建一个新的受保护方法
    将两个字符串,
    integrity
    sWAnswer
    作为参数。然后,直接从测试中调用新方法。这样可以指定可以可靠测试的已知字符串。如果让super指定,对super的更改将中断测试。根据定义,这不是单元测试。@JeffNeet,我正在为旧类编写单元测试。因此,我不允许修改代码。@user3473132