Junit源中特定功能的位置

时间:2014-02-06 02:34:41

标签: java junit

JUnit 4.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会检查其Runner,如果不公开则拒绝运行它们,但这是一个不同的问题。

2 个答案:

答案 0 :(得分:3)

实际检查位于FrameworkMethod#validatePublicVoid(boolean, List<Throwable>)

Runner延伸的

ParentRunner个实现会在validate()构造函数中调用ParentRunnervalidate()private,但它委托给protected方法,该方法实现了名为collectInitializationErrors(List<Throwable>)的覆盖。 BlockJUnit4ClassRunner的实现调用validateInstanceMethods(errors);(不推荐使用,因此很奇怪)最终会调用上面的方法。


困惑编辑:

我不知道你在问什么了。 JUnit没有什么特别之处。它只是一个图书馆。您编写的Java代码具有许多对JUnit有意义的注释。 JUnit无法阻止您编写代码。

JUnit或您(或您的IDE)提供了一个具有main方法的类。

它会像这样执行

java -cp <some class path> TheClassWithMain <more arguments>

就像任何其他java计划一样。

JUnit类,即。 ParentRunner,其子级和其他相关人员使用反射来扫描您提供的测试类。他们这样做是为了建立一个测试套件,即。设置方法,测试方法,拆除方法,抛出异常期望,断言期望等。

JUnit API提供了关于允许内容和不允许内容的非常具体的文档。你可以找到javadoc here。例如,对于@Test,它说

  

Test annotation告诉JUnit public void方法   附件可以作为测试用例运行。

无论您的IDE是什么,都是如此。

请记住,这些不是编译时间检查,它们是运行时检查,是对代码进行反思分析的结果。

现在,您的IDE,无论它是什么,都可能有一个JUnit插件,可以静态执行这些检查,即。对代码进行静态分析,而不是运行时分析。它可以这样做,因为源代码可用。

如果您的问题与IDE行为有关,则需要指定您正在使用的IDE。如果您的问题是关于JUnit如何阻止private @Test方法运行,那么答案就在上面。

答案 1 :(得分:0)

类中的私有方法在类外部不可见,因此它们对JUnit测试类不可见。这就是Java语言的工作方式,JUnit不需要任何代码来检查它。

如果您希望私有方法对于测试是可见的,而不是为了其他目的,那么一个常见的解决方案是通过省略声明中的范围来使它们成为默认范围 - 有时称为“包私有”:

void function() {...

而不是

private void function() {...

如果这样做,同一个包中的JUnit测试类将可以访问它们进行测试。