Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Junit源中特定函数的位置_Java_Junit - Fatal编程技术网

Java Junit源中特定函数的位置

Java Junit源中特定函数的位置,java,junit,Java,Junit,JUnit4.x不提供私有方法来为它们生成测试方法。我在junit源代码(从github下载)中查找代码中强制执行的位置,但找不到它。我确实找到了它在哪里检查测试方法本身是公共的,但我正在寻找它在哪里显式检查目标类的方法的修饰符,或者以其他方式忽略或跳过处理目标类的私有方法。有人知道这个代码可能在哪里吗 增编: 好的,我们已经就此进行了一次愉快的交谈,下面是我们学到的东西。假设您有一个foo类,它有两个方法bar和baz,这两个方法都是私有的。通常,使用某些IDE和JUnit4.x的组合,您不能

JUnit4.x不提供私有方法来为它们生成测试方法。我在junit源代码(从github下载)中查找代码中强制执行的位置,但找不到它。我确实找到了它在哪里检查测试方法本身是公共的,但我正在寻找它在哪里显式检查目标类的方法的修饰符,或者以其他方式忽略或跳过处理目标类的私有方法。有人知道这个代码可能在哪里吗

增编:

好的,我们已经就此进行了一次愉快的交谈,下面是我们学到的东西。假设您有一个foo类,它有两个方法bar和baz,这两个方法都是私有的。通常,使用某些IDE和JUnit4.x的组合,您不能让JUnit为这些方法生成测试存根,因为它们是私有的。此规则“不为私有方法生成测试存根”是在IDE级别强制执行的,而不是JUnit本身的一部分

所以对于这样一个类:

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检查测试方法本身的位置