首页 文章

在使用IntelliJ在kotlin gradle项目中调试单元测试时,为什么会有几十个无意义的异常?

提问于
浏览
1

我上传了一个由两个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 在我的 error 电话上死于 IllegalStateException . 但是,现在我想使用IntelliJ调试失败的测试 . 所以我使用IntelliJ的"import project"功能 . 完成后,行号与测试函数的开头之间会出现绿色箭头,右键单击它会为我提供调试测试的选项 . 选择该选项会调出调试器,并立即运行并使测试失败 .

我想在异常时自动中断,所以我在断点窗口中检查"Any Exception"的启用按钮,然后尝试再次启动测试 . 我立即被带到了类加载器,它为 "org.groovy.debug.hotswap.ResetAgent" 抛出一个 ClassNotFoundException . 我点击继续,我得到另一个 ClassNotFoundException ,这比我可以计算的次数多 . 大多数例外都是关于 org.junit 类的,偶尔会混合使用kotlin和gradle类进行调味 .

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

在许多相同项目中与我合作的同事坚持认为他从未见过这些例外,这表明我的配置有问题,但我找不到任何似乎影响结果的intellij设置 .

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

问题是:为什么junit首次启动时会出现如此多的令人讨厌的异常?

1 回答

  • 0

    正如@Strelok在评论中所暗示的那样,代码没有任何问题,并且当JUnit启动时被各种内部组件抛出的无用异常的动物只是其初始化的正常部分 .

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

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

    “任何异常”使用catch类过滤器org.junit.runners . *和类过滤器-org.junit . *对捕获和未捕获的异常进行断点,以消除JUnit机制本身抛出的捕获异常 .

    不幸的是,似乎没有办法使其成为默认值,因此必须为每个intellij项目完成,但它确实导致调试器仅停止在我的代码中的未处理异常 .

相关问题