Java 像doFilter这样的无效方法进行单元测试的好处或目的是什么?

Java 像doFilter这样的无效方法进行单元测试的好处或目的是什么?,java,unit-testing,tomcat,Java,Unit Testing,Tomcat,我在JavaTomcat堆栈上创建一个新的过滤器。我对单元测试感兴趣,因为我希望有100%的分支覆盖率 此筛选器包装响应对象。我们重写了响应的默认行为,因此无论何时调用response.addCookie(cookie),我们都会在cookie名称后面附加字符串“happy”: HappyCookieFilter implements Filter { HappyCookieResponseWrapper happyCookieResponseWrapper; ... public void

我在JavaTomcat堆栈上创建一个新的过滤器。我对单元测试感兴趣,因为我希望有100%的分支覆盖率

此筛选器包装响应对象。我们重写了响应的默认行为,因此无论何时调用response.addCookie(cookie),我们都会在cookie名称后面附加字符串“happy”:

HappyCookieFilter implements Filter {
HappyCookieResponseWrapper happyCookieResponseWrapper;
...

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
    chain.doFilter(req, happyCookieResponseWrapper.wrap(res));
}

...
}
  • 假设HappyCookieResponseWrapper已经过单元测试,那么测试doFilter方法的好处是什么
  • 如何测试HappyCookieFilter.doFilter,应该断言什么
  • “测试
    doFilter
    方法有什么好处?”

    没有

    引用对问题“”的答案:

    单元测试用于测试代码的行为

    在该
    过滤器中确实没有要测试的行为。要测试的行为在
    HappyCookieResponseWrapper
    类中,您已经在测试它了。重复那个测试只会浪费时间


    “我想要100%的分行覆盖率”

    引用上述同一答案的不同部分:

    @威尔说你的目标应该是100%的代码覆盖率,但在我看来,这是一种危险的干扰。您可以编写覆盖率为100%的单元测试,但却完全不进行任何测试

    如果
    doFilter()
    方法具有“有趣”的逻辑,如特殊筛选或路由规则,则测试它们将是测试此void方法的目的。一般来说,如果void方法具有创建side effecs的逻辑(在您的情况下,除了调用
    chain.doFilter()
    ),那么测试所述void方法的目的就是测试该逻辑。另一方面,这个逻辑可以并且应该存在于一个非void方法中(可能在另一个类中),该方法可以自己测试


    拥有100%的覆盖率(行或分支)并不是什么目标(特别是如果您不确保代码不仅被覆盖,而且还被断言)

    这是一个非常有效的单元测试类和方法

    chain.doFilter
    中测试
    HappyCookieSresponseWrapper.wrap(response)
    的预期行为是否作为请求通过。无技术细节。 可能在请求中设置了cookie。happyCookieResponseWrapper的业务逻辑和功能不需要重复。可能存在基本重叠(设置了cookie),但这发生在两个不同的级别

    顺便说一句,看到一个请求的响应包装器我有点惊讶,但当它编译时,它就可以了

    这是一个非常狭隘/琐碎的检查,但假设此代码在将来某个时候被重新设计为使用另一个包装器类,该类不能实现正确的行为。
    回归错误会很快被发现,而不是听到模糊描述的错误并处理票据。

    我的同事希望得到100%的覆盖率。我们不想断言调用了chain.doFilter吗?这不是一种行为吗?它(理论上)提供了什么好处,无论有多小?@EricCherin单元测试过滤器实际上不会测试您的整个web应用程序是否正确安装了过滤器。这将是一个系统测试,如果有的话,不是单元测试。单元测试将是:…HappyCookieFilter.doFilter(…verify(chain).doFilter()@EricCherin在我看来,这和测试普通getter方法一样无用。我同意你永远不应该以100%的测试覆盖率为目标。你尝试测试你自己编写的所有逻辑。在这种情况下,你会在一个甚至不是你的库中的对象上测试一个方法。这与测试java.l是一样的ang.String类。什么是
    response
    ?如果它应该与
    res
    相同,那么为什么HappyCookieSponseWrapper.wrap(response)会出现这种情况调用是否返回
    ServletRequest
    对象?我肯定会对
    doFilter
    方法进行统一测试。该测试将保证调用
    HappyCookieResponseWrapper
    上的wrap函数。当某个组件或类经过完美的编程和测试,然后忘记使用时,我看到了太多的错误或者以错误的方式使用。这是一个行为单元测试。