由于我正在为我们的代码添加更多单元测试,因为一个简单的问题而陷入困境。
我需要编写一些样板代码,以便编写测试类。例如,要在没有配置Resin服务器的情况下连接到数据库,请使用JNDI注入。
我的问题是:我在哪里可以放置仅与测试相关的样板代码?当然,它需要在我的测试目录中,但是在我的包树中创建一个包,称之为“工具”是一个好习惯,因为这个包在项目源的包树中没有等价物?为什么或为什么不呢?
编辑:
让我们举个例子:我需要创建一个类来将数据库连接注入到我的测试类中。我们称之为JNDIDatabaseInjector。此类显然仅用于测试目的,因为生产中使用的数据库连接是在应用程序服务器配置中定义的。我应该在哪个包中最好地放置我的JNDIDatabaseInjector类?
答案 0 :(得分:2)
这是我为基于maven的项目推荐的结构:
.
|-- src/
| |-- main/
| | `-- java/
| | `-- com/
| | `-- example/
| | |-- bar/
| | | `-- Bar.java
| | `-- foo/
| | `-- Foo.java
| `-- test/
| |-- java/
| | `-- com/
| | `-- example/
| | |-- bar/
| | | `-- BarTest.java
| | |-- foo/
| | | `-- FooTest.java
| | |-- util/
| | | `-- Util1.java
| | |-- AbstractTest.java
| | `-- Util2.java
| `-- resources/
| `-- com/
| `-- example/
| |-- bar/
| | `-- BarTest-context.xml
| `-- foo/
| `-- FooTest-context.xml
`-- pom.xml
正如您所看到的,我将Util1.java
放在util
子目录中,但恕我直言的第一个公共父包(在本例中为com.example
)是更好的选择。我还建议您创建基本抽象AbstractTest
类以及实用程序以共享通用测试样板。
另请注意我放置测试资源的位置(本示例中为Spring上下文配置)。这样,您只需发出以下命令即可轻松访问某些测试数据(XML,SQL等)。
getClass().getResource("someFile.txt")
如果您在com.example.foo.FooTest
,则上述语句会自动从src/test/resources/com/example/foo/someFile.txt
加载文件。
此目录布局可防止包之间存在兄弟依赖关系(仅 child - > parent 或 parent - > child )。不知道为什么,但不知何故感觉好多了。当您想要在maven工件之间共享测试实用程序时,真正的问题就出现了 - 这是maven的配置约定方法的最大缺陷之一。
答案 1 :(得分:1)
我将所有的for-release软件包放在一个src源文件夹中(在Eclipse中)。所有junits都在test-src源文件夹中。这使得分离测试代码和仅释放要发布的包变得简单。
所以看起来像这样:
MyProject
- src
+ com.mycompany.tool
- test-src
- com.mycompany.tool
TestBed.java
在设置时,您可能需要查看mockito来创建样板。