加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 对不适合作为新类提取的私有方法进行单元测试的好方法是什

发布时间:2020-12-16 10:37:29 所属栏目:百科 来源:网络整理
导读:粗略地说,我有一个实现一个只运行一个公共方法的线程的类.该方法进入一个循环,就像调度程序一个接一个地处理网络消息;如下: class WorkerThread { public: void run() { while (!b_shutdown) { message = getNextMessage(); switch(message.type) { case WR
粗略地说,我有一个实现一个只运行一个公共方法的线程的类.该方法进入一个循环,就像调度程序一个接一个地处理网络消息;如下:

class WorkerThread {

  public:

    void run() {
      while (!b_shutdown) {
        message = getNextMessage();
        switch(message.type) {
          case WRITE:
            write();
          case READ:
            read();
          // ...
          // more cases to handle
        }
      }
    }


  private:

    void write() { /* logic to test */ }
    void read() { /* logic to test */ }
    // more private methods with logic that needs testing

    // some member variables
};

所以重点是我真的不想

>将私有方法提取到另一个类,因为在语义上它们是此WorkerThread的一部分.
>将方法公之于众,因为它们不会在课外的任何地方使用.
>跳过测试,因为它是那些实现主逻辑的方法.

但是,如何优雅地测试私有方法呢?

注意:

>可能需要更多的公共方法来处理线程的启动和终止,但这不是问题所在.
>我认为这个问题不仅限于c,所以我用更流行的静态类型Java标记它以获得更多关注:P

解决方法

引用问题:

I really don’t want to extract the private methods out to another class,because semantically they are part of this WorkerThread.

那是错的.你违反了Single Responsibility Principle.

提供“多线程支持”和“做实际工作”是两回事.您不应强制执行“执行实际工作”是私有实现细节.

从这个意义上说:你为自己制定的规则实际上导致你难以编写测试代码.因此,不要“解决”糟糕设计的症状 – 更好地退后一步并修复您的设计.

换一种说法:

>重做你的工作线程,以便能够运行任何类型的工作
>单独关注;并将“这种工作”纳入专业课程

通过这样做,不仅可以改进您的设计,还可以使测试更容易:因为现在,您可以在没有任何多线程复杂性的情况下对“执行实际工作”进行单元测试.你只是断言,按顺序完成后东西才有用.然后你自己测试多线程部分;不用担心实际的工作.最后,一切都很好地融合在一起.

而不是担心如何测试内部实现细节.哪个 – 你没有;另一个答案完全正确!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读