java - Effective Java Item 13 和 TDD

标签 java testing tdd class-visibility

我刚刚在 google 上搜索了“Joshua Bloch TDD”……没有找到太多结果,这真是太可惜了,因为我真的很想知道他对这件事要说些什么。

第 13 项(我正在看第 2 版)的标题是“最小化类和成员的可访问性”。在几页之后他说:

To facilitate testing, you may be tempted to make a class, interface or member* more accessible. ... It is acceptable to make a private member of a public class package-private in order to test it, but it is not acceptable to raise the accessibility any higher than that... Luckily, it isn't necessary either, as tests can be made to run as part of the package being tested, thus gaining access to its package-private elements.

* 他所说的“成员”是指“字段、方法、嵌套类和嵌套接口(interface)”。

作为一个TDD新手,但逐渐站稳脚跟,我意识到目前的共识似乎是不将测试类包含在应用程序代码包中,甚至在src\test和src\main下也没有匹配的结构:大多数 TDD 专家似乎很容易以其他方式构建他们的测试目录(例如,您有一个名为“unittests”的目录,另一个名为“functionaltests”,另一个名为“e2etests”)。

具体来说,我在“Growing Object Oriented Software Guided by Tests”中关注了拍卖应用程序的 TDD 开发。那里的作者毫不犹豫地添加了数百个公共(public)方法。此外,在一章之后我查看了下载的“到目前为止的结构”,他已经完全改变了测试目录结构以将事物分为测试类别......

至少在过去,是否有任何经验丰富的 TDD 手发现这是困境的根源?如果是这样,你是如何解决的?

作为一个实际示例,我通过开发一个 Lucene 索引应用程序来学习 TDD 技术:它为文档编制索引,然后让您查询它们。目前,所有应用程序类都在同一个包中。实际上需要公开的唯一方法是一个类中的main。然而,当然,我有很多很多公共(public)方法:如果不是因为我正在使用 TDD,它们都可以是包私有(private)的。

PS 没有“method-visibility”标签所以我选择了“class-visibility”

稍后

似乎我可能被“成长的面向对象...”中采用的方法引向了一条相当不幸的道路,其中过度使用公共(public)方法可能只是因为它是该技术的演示.哈。

如果你想拆分你的测试类别,有没有人使用过这种方法:

\src\unit_tests\java\core\MainTest.java

还有,例如:
\src\func_tests\java\core\MainTest.java

\src\e2e_tests\java\core\MainTest.java?

最佳答案

as tests can be made to run as part of the package being tested

这并不意味着您必须将测试放在与主类相同的目录中,它们只需要放在相同的包中即可单独的目录。

假设您有一个包com.acme.foo。所以你的目录结构可能是:

src
  main
    java
      com
        acme
          foo
            MainClass
  test
    java
      com
        acme
          foo
            MainClassTest

MainClassTestMainClass 在同一个包中,因此它可以访问包私有(private)的东西。但这些是单独的目录,因此生成的 JAR 将不包含 MainClassTest

关于java - Effective Java Item 13 和 TDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089617/

相关文章:

java - 带有连接继承注释的一对多映射 :

java - 不同的对象和引用

java - 在 Java 中编写默认的 Comparator 类

android - Robolectric 未发现我的 list 未通过所有测试

ruby - 调用其他方法的 TDD 方法的正确方法

c# - 如何对 MVC ASP.Net 返回正确的 View 进行单元测试?

java - java中lastIndexOf的时间复杂度是多少?

ruby-on-rails - 是否可以验证为使用 Rails 集成测试设置了 cookie 的域?

testing - 开 Jest , Unresolved promise 不会失败

java - 如何在单元测试(junit)中管理巨大的类和重构