gradle - 当使用IntelliJ调试kotlin gradle项目中的单元测试时,为什么会有几十个废话异常?

标签 gradle intellij-idea kotlin

我上传了一个由两个kotlin文件组成的trivially-simple test project to gitlab
Trivial.kt有一个简单的类:

package com.example
class Trivial {
    fun gus() {
        error("Behold my erroneousness!")
    }
}
TrivialTests.kt有一个简单的测试:
package com.example
import org.junit.Test
class TrivialTests {
    @Test
    fun testGus() {
        val din = Trivial()
        din.gus()
    }
}
build.gradle文件执行apply plugin: 'kotlin'并列出通常的依赖关系:
dependencies {
  compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
  compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

  testCompile 'junit:junit:4.12'
  testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
}

而且,就Gradle本身而言,这一切都完全符合您的期望。 ./gradlew test在我的IllegalStateException调用中死于error。但是,现在我想使用IntelliJ调试失败的测试。因此,我使用IntelliJ的“导入项目”功能。完成后,在行号和测试功能的开始之间会出现一个绿色箭头,右键单击它可以给我调试测试的选项。选择该选项将打开调试器,并立即运行并使测试失败。

我想自动打破异常,因此我在断点窗口中选中“任何异常”的“启用”按钮,然后尝试再次启动测试。我立即被带到类加载器,该类加载器将ClassNotFoundException抛出为"org.groovy.debug.hotswap.ResetAgent"。我单击“继续”,然后得到另一个ClassNotFoundException,它进行的次数超出了我的计算。大多数异常(exception)是关于org.junit类的,偶尔会混合kotlin和gradle类以获取味道。

使用class filter,我从断点中排除了从*ClassLoader引发的异常,然后继续。下一站是java.lang.Integer,它引发数字格式异常,因为intellij本身已尝试调用Integer.parseInt("java/util/concurrent/CompletableFuture$UniRun")。它使用不同的类型名称多次执行此操作,然后轮到JUnit,获取FileNotFoundException,以尝试打开属性文件和一堆不存在的jar。

与我一起从事许多相同项目的同事坚决表示,他从未见过这些异常(exception)情况,这表明我的配置存在问题,但我找不到任何似乎会影响结果的intellij设置。

我可以通过将软件包列入白名单来获得所需的调试行为-添加通配符类过滤器以仅包含com.example*

问题是:为什么在junit首次启动时会有这么多讨厌的异常?

最佳答案

正如@Strelok在注释中所建议的那样,代码没有任何问题,并且在JUnit启动时,各种各样的内部对象抛出的无用异常的隐患只是其初始化的正常部分。

我的同事从未看到这些异常,因为他在异常断点UI中未选中“捕获的异常”。这里的问题是IntelliJ并不是JUnit的特殊情况,而JUnit会捕获测试中发生的所有异常,因此,取消选中该选项会导致测试失败,而不会在断点处停止。

Hans-Peter Störrthis answer中提供了一个更好的解决此问题的方法:

"Any exception" Breakpoint on caught and uncaught exceptions with a catch class filter org.junit.runners.* and a class filter -org.junit.* to get rid of caught exceptions that are thrown by the JUnit mechanics itself.



不幸的是,似乎没有办法将其设置为默认值,因此必须对每个intellij项目都进行默认设置,但这会导致调试器仅在代码中未处理的异常处停止。

关于gradle - 当使用IntelliJ调试kotlin gradle项目中的单元测试时,为什么会有几十个废话异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49180102/

相关文章:

configuration - Gradle使用文件结构拆分测试任务

java - Visual Studio Code 无法识别 java 项目

testing - 最新的 Groovy 稳定版本令人费解的问题

intellij-idea - 如何阻止 IntelliJ IDEA 从 .properties 文件中删除空行?

android - 有没有办法理解安装错误代码的实际含义?

android - Gradle "manifest requires a placeholder substitution"错误但 manifestPlaceholders 提供了一个值

android-studio - android studio/intellij idea goto行号

javascript - 如何在 Intellij IDEA 中按位置模式自动注入(inject)语言?

Android 导航组件在 Activity 旋转时保留当前 Fragment

android - 如何在 Kotlin 中滑动 fragment 时选择 BottomNavigationView 中的项目