0

我刚刚在 Google 上搜索了“Joshua Bloch TDD”... 没有找到太多信息,这真是太遗憾了,因为我真的很想知道他在这件事上要说什么。

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

为了便于测试,您可能想使类、接口或成员*更易于访问。... 将公共类包的私有成员设为私有以对其进行测试是可以接受的,但是将可访问性提高到更高的水平是不可接受的...幸运的是,这也不是必需的,因为测试可以作为被测试包的一部分运行,从而获得对其包私有元素的访问。

* “成员”是指“字段、方法、嵌套类和嵌套接口”。

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

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

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

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

PS“方法可见性”没有标签,所以我选择了“类可见性”

之后

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

如果您想拆分测试类别,是否有人使用过这种方法:

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

而且,例如:
\src\func_tests\java\core\MainTest.java

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

4

2 回答 2

1

因为测试可以作为被测试包的一部分运行

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

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

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

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

于 2016-12-11T18:47:13.033 回答
0

我不确定这在 Gradle 中是如何工作的,因为我使用的是 Maven,但我想那里的概念是相似的。因此,我将在考虑 Maven 的情况下对其进行解释。Maven 项目中的典型设置如下所示:

在此处输入图像描述

在项目的根级别上有srctargettarget在构建过程中创建的所有内容都进入该文件夹。这意味着src包含我们实际项目的来源。下面src还有另外两个目录:maintest. 简单地说main,所有最终会在生产代码中交付的东西。该test目录包含main树的测试代码。

因此,src/main/java目录中的相同包层次结构通常也存在,src/test/java因此对于具有相同包定义的测试类,将可以访问驻留在main分支中的生产类的所有成员。

于 2016-12-11T18:51:15.787 回答