为什么JUnit 5的默认访问修饰符改为包私有?

40

为什么JUnit 5中默认的访问修饰符是包可见性?

在JUnit 4中,测试必须是public。

将其改为包可见性的好处是什么?


1
你认为在JUnit5中声明为public的测试将不再起作用了吗? - Stultuske
5
好处在于您不需要在每个地方都添加“public”。 - JB Nizet
1
@Stultuske 哈哈,不,我没有写过这样的东西... - wojtek1902
2个回答

61
为什么JUnit 5中默认的访问修饰符是包私有的?
在JUnit Jupiter(JUnit 5)中,实际上没有所谓的“默认”修饰符。你可以选择使用publicprotected或包私有的修饰符。
将修饰符改为包私有的好处是不再需要使用public修饰符。如果你的IDE自动生成的测试方法和测试类是public的,那么可以保留它们的public修饰符。
但是如果你手动编写测试方法,就可以省略public修饰符,除非你要设计可被其他包继承的测试类,这时你需要将可重写的测试方法设置为publicprotected。当然,接口的default方法必须是public的。
总之,JUnit 5团队坚信“简约即美”的原则,也就是说,你需要输入的内容越少,就越好!

4
我想提供一个不同的观点: 在这种情况下,少打字也意味着表达能力的减少。当我将我的测试公开时,我表达了这样一个事实:测试暴露给外部调用者(测试框架),就像我编写用于其他应用程序使用的库一样。 当使用其他访问修饰符时,JUnit 将需要在运行时使用反射来更改它们。 虽然可以在不指定访问修饰符的情况下进行编写,但我选择明确地添加它。对我来说,添加 public 是向 JUnit 和其他开发人员表达我的意图的最佳方式。 - Jaap Coomans
我们的单元测试类实例变量怎么办?既然我要走这条路,我想开始在我的模拟和其他实例变量上使用默认修饰符(<none>)。 - IcedDante
谢谢。看了一本JUnit 5的教材,遇到了这样一句话:“测试方法使用package protected更佳,因为这样可以减少打字”。这让我想到“打字”在这里是指强制类型转换或类似的东西。我已经尝试了很长时间才理解这个语句表达的关系。但现在看到你的回复,我真的很高兴。 - divad
1
我认为这个答案缺少了一个主要的点——为什么?是的,没错,简单往往意味着更好,我相信不仅仅是你们(JUnit团队)相信这一点。但问题是——为什么?更准确地说——如何?或者再详细一些——为什么在JUnit5之前需要它,以及为什么(有什么变化)在JUnit5中不需要它了?难道只是因为你们无缘无故地要求“公开”,现在又改变了主意吗? :) - Giorgi Tsiklauri

5

这是JUnit 5的一个特性,它为测试类和方法提供了更好的封装性。

使Jupiter测试包可见 #679

测试类通常位于被测试类所在的相同包中

better way is to place the tests in a separate parallel directory structure with package alignment.

main/                          test/
   com/                           com/
      xyz/                           xyz/
          SomeClass.java               SomeClassTests.java

This approach allows test code to access all the public and package visible members of the classes under test.


1
我不确定这是否回答了我的问题...我知道这是一个功能,你写的所有内容都是针对所有测试框架的一般方法。将测试设置为包私有而不是公共的好处是什么? - wojtek1902
@wojtek1902 它为测试类和方法提供了更好的封装。 - user7294900
3
我在测试中需要封装的原因是什么? - wojtek1902
@wojtek1902 测试仍然是Java代码(尽管不在生产环境中执行)。 - user7294900
2
说实话,这并没有让我信服... 我无法在测试中看到封装的任何好处... - wojtek1902
1
引用Martin Fowler的话:“测试代码和生产代码一样重要。给予同等的关注和关心。‘这只是测试代码’不是一个合理的借口来证明代码质量低下。” https://martinfowler.com/articles/practical-test-pyramid.html#WritingCleanTestCode - Christopher Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接