Java Junit源中特定函数的位置
JUnit4.x不提供私有方法来为它们生成测试方法。我在junit源代码(从github下载)中查找代码中强制执行的位置,但找不到它。我确实找到了它在哪里检查测试方法本身是公共的,但我正在寻找它在哪里显式检查目标类的方法的修饰符,或者以其他方式忽略或跳过处理目标类的私有方法。有人知道这个代码可能在哪里吗 增编: 好的,我们已经就此进行了一次愉快的交谈,下面是我们学到的东西。假设您有一个foo类,它有两个方法bar和baz,这两个方法都是私有的。通常,使用某些IDE和JUnit4.x的组合,您不能让JUnit为这些方法生成测试存根,因为它们是私有的。此规则“不为私有方法生成测试存根”是在IDE级别强制执行的,而不是JUnit本身的一部分 所以对于这样一个类:Java Junit源中特定函数的位置,java,junit,Java,Junit,JUnit4.x不提供私有方法来为它们生成测试方法。我在junit源代码(从github下载)中查找代码中强制执行的位置,但找不到它。我确实找到了它在哪里检查测试方法本身是公共的,但我正在寻找它在哪里显式检查目标类的方法的修饰符,或者以其他方式忽略或跳过处理目标类的私有方法。有人知道这个代码可能在哪里吗 增编: 好的,我们已经就此进行了一次愉快的交谈,下面是我们学到的东西。假设您有一个foo类,它有两个方法bar和baz,这两个方法都是私有的。通常,使用某些IDE和JUnit4.x的组合,您不能
public class Foo
{
private void bar(){}
private void baz(){}
}
您无法生成以下内容:
public class FooTest{
@Test
public void testBar(){}
@Test
public void testBaz(){}
}
但是,如果您更改IDE,完全不使用JUnit,您可以生成这些测试方法。请注意,如果标记为@Test的方法是公共的,JUnit将检查其运行程序,如果不是,则拒绝运行它们,但这是另一个问题。类中的私有方法在类外不可见,因此它们对JUnit测试类不可见。这就是Java语言的工作方式,JUnit不需要任何代码来检查这一点 如果您希望私有方法在测试时可见,但不用于其他目的,一种常见的解决方案是通过在声明中省略作用域,使它们成为默认作用域(有时称为“包私有”):
void function() {...
而不是
private void function() {...
如果您这样做,同一个包中的JUnit测试类将有权访问它们进行测试。实际检查在
FrameworkMethod\validatePublicVoid(boolean,List)
中
Runner
扩展自ParentRunner
的实现在ParentRunner
构造函数中调用validate()
。那validate()
是private
,但它将委托给一个受保护的方法,实现会覆盖名为collectInitializationErrors(List)
的方法BlockJUnit4ClassRunner的实现调用validateInstanceMethods(错误)代码>(这是不推荐的,所以很奇怪)最终调用了上面的方法
混乱的编辑:
我不知道你在问什么。JUnit没有什么特别之处。它只是一个图书馆。您编写的Java代码包含许多对JUnit有意义的注释JUnit无法阻止您编写代码。
JUnit或您(或您的IDE)提供了一个具有main
方法的类
它就这样被处决了
java -cp <some class path> TheClassWithMain <more arguments>
java-cp TheClassWithMain
就像任何其他java
程序一样
JUnit类,即ParentRunner、其子类和其他相关类,使用反射扫描提供的测试类。他们这样做是为了建立一个测试套件,即设置方法、测试方法、拆卸方法、抛出的异常预期、断言预期等
JUnitAPI有非常具体的文档说明什么是允许的,什么是不允许的。您可以找到javadoc。例如,对于@Test
,它说
测试注释告诉JUnit,public void
方法
它是附加的,可以作为测试用例运行
无论您的IDE如何,这都是正确的
请记住,这些不是编译时检查,它们是运行时检查,是代码反射分析的结果。
现在,您的IDE,不管它是什么,都可能有一个JUnit插件静态地执行这些检查,即对代码进行静态分析,而不是运行时分析。它可以做到这一点,因为源代码是可用的
如果您的问题是关于IDE行为的,则需要指定您正在使用的IDE。如果您的问题是关于JUnit如何阻止运行private
@Test
方法,答案在上面 您使用的是哪种跑步者?我想,作为示例,默认值也可以。让我们假设BlockJUnitForClassRunner,因为这似乎是一个主要问题。我对JUnitJUnit不太熟悉,它使用反射来调用您的@Test
带注释的方法。通过反射,您可以访问和调用私有方法。。我不认为这是一种机制,因为测试类可以定义为要测试的类的内部类,在这种情况下,测试生成机制将具有可见性。。此外,通过反射对目标类的方法进行迭代(我认为JUnit就是这么做的),会导致测试生成代码在测试方法生成过程中遇到目标类的私有方法……Sotirios感谢您的提示,但实际上这不是我的问题……:-)@user3277785什么提示?我只是说答案有什么问题。@SotiriosDelimanolis我对这个问题的解释是,他问的是被测类中的私有方法,而不是私有JUnit测试方法,根据他的评论,我仍然认为这是正确的。@user3277785只是为了解释我所做的。我下载JUnit的源代码,并在调试模式下运行单元测试。我在堆栈跟踪中查找调用@Test
方法的位置。然后我检查了它的取回位置以及跑步者是如何使用它的。非常感谢你解释了你解决问题的方法。。一个人能得到的最有价值的答案。该死..我在离开IDE时批准了这个答案;现在我必须“取消批准”它(这是一件事吗?)。无论如何,重要的一点是,你引用的FrameowrkMethod方法就是我刚才说的,我喜欢JUnit检查测试方法本身的位置