如何在Junit中使用类别时使用自定义运动员?
  我有一堆JUnit测试,它们扩展了我的基本测试类BaseTest ,它又扩展了Assert 。  我的一些测试有一个@Category(SlowTests.class)注释。 
  我的BaseTest类使用以下注释@RunWith(MyJUnitRunner.class)注释。 
  我已经设置了一个Gradle任务,预计只能运行SlowTests 。  这是我的Gradle任务: 
task integrationTests(type: Test) {
    minHeapSize = "768m"
    maxHeapSize = "1024m"
    testLogging {
        events "passed", "skipped", "failed"
        outputs.upToDateWhen {false}
    }
    reports.junitXml.destination = "$buildDir/test-result"
    useJUnit {
        includeCategories 'testutils.SlowTests'
    }
}
  当我运行任务时,我的测试不运行。  我已经精确定位这个问题进行相关的定制的运行MyJUnitRunner上BaseTest 。  如何设置我的Gradle或测试结构,以便在使用Suite时可以使用自定义运动员。 
  解决这个问题的办法变得比我想象的要小和棘手。  Gradle正在使用我的自定义测试运行filter并正确调用filter方法。  但是,我的runner通过自己的类加载器为Javaassist增强功能重新加载所有测试类。 
  这导致了SlowTest注释通过Gradle类加载器加载的问题,但是当传递给我的自定义运行器时,运行器检查该类是否使用该注释注释。  由于通过两个不同的类加载器加载的SlowTest注释的等SlowTest不同,此检查从未正确解析。 
-
由于我已经完成了这项研究,所以我将在此留下。 经过Gradle和(神秘的)JUnit资源挖掘了几天之后,我得到了这些。
  除了测试分类之外,Gradle并不处理任何高级JUnit功能。  当您使用包含类别或排除类别条件创建Gradle任务时,它会构建一个CategoryFilter。  如果您不知道, Filter是JUnit提供给测试运行者的信息,用于决定是否应该过滤测试或测试方法。  测试运行者必须实现可Filterable界面。 
  JUnit带有多个跑步者, Categories只是其中的一个。  它扩展了一个名为Suite的测试运行者家族。  这些基于套件的跑步者旨在运行“套件”测试。  一套测试可以通过注释自省来构建,通过明确定义套件中的测试或者任何其他构建测试套件的方法。 
  在Categories的情况下,JUnit有它自己的CategoryFilter但Gradle不使用它,它使用它自己的CategoryFilter 。  两者都提供或多或少相同的功能,并且是JUnit过滤器,因此任何实现Filterable套件都可以使用它们。 
  负责运行JUnit测试的Gradle中的实际类称为JUnitTestClassExecuter 。  一旦它解析了命令行选项,它就会请求JUnit检查运行器是否应该用于测试。  如此处所示,每个测试都会调用此方法。 
  其余的只是JUnit。  Gradle刚刚创建了一个自定义RunNotifier来生成代表测试结果的标准XML文件。 
我希望有人发现这个有用,并节省了无数小时的调试。
  TLDR:您可以在Gradle中使用任何跑步者。  Gradle没有关于跑步者的具体细节。  这是JUnit决定参赛者。  如果你想知道你的测试将使用哪个runner,你可以通过调用Request.aClass(testClass).getRunner()来进行调试。  将此文件解压到您的代码库并将其打印到控制台。  (我没有成功地将调试器附加到Gradle上。) 
上一篇: How can I use a custom runner when using categories in Junit?
