我是使用 nunit(以及一般的 Java 开发)进行单元测试的新手。在为类上的私有方法创建单元测试时,看起来测试文件必须与被测试的类在同一个包中。避免导出单元测试 API 的典型方法是什么?我可以使类/测试方法受包保护吗?还是开发人员通常有一个单独的发布版本,不包括单元测试文件?
5 回答
我可以告诉 IntelliJ 或 Ant 不要在部署中打包 JUnit 测试。我在与源代码不同的目录中进行了测试,这使得它成为可能。
不要将源类和测试类混在一起。将它们分开以使您使用的工具/脚本更容易部署。
测试文件不必与被测试的类在同一个包中。事实上,将测试文件放在一个完全独立的包中是一种很好的做法,允许它们测试公共 API 而无需关心包级实现细节。
或者,您可以设置构建脚本(例如 Nant)以在构建发布可执行文件时忽略包含“测试”的文件。
就我个人而言,我的方法只是测试暴露的功能,因此您最终只能测试封装良好的部分。
这通常会导致我的设计包含具有明确定义的功能的小类,这些小类更容易测试。
通常,在进行单元测试时,您不应该关心您正在测试的内部结构,所以我发现这是处理它的最佳方法。
我也同意最好将测试和生产代码分开。
将测试源代码保留在应用程序源代码之外。一般来说,只测试暴露的功能。如果您确实需要测试私有行为,请创建一个扩展真实对象并允许公共访问私有行为的测试对象。
我认为将您的测试代码移出 CUT(被测类)的包是错误的。在某些时候,您可能想要测试受保护的方法或类,而将您的测试代码放在另一个包中会使这变得困难或不可能。
更好的解决方案是为您的测试代码创建一个单独的目录,该目录仅反映您的生产代码的包结构。这就是我所做的:
src/main/java/com/example/Foo.java
src/test/java/com/example/FooTest.java
src/test/**
然后,在打包和部署时,您的构建脚本可以非常简单地忽略。