跳转至

插件测试

IntelliJ Platform 插件测试更偏向模型级功能测试,而不是孤立单元测试。测试通常启动轻量 IDE 环境,使用真实平台组件加载文件、执行功能,再比较结果。

测试思路

常见测试输入和输出:

  • 输入文件:放在 testData
  • 光标位置、选区、高亮:用特殊标记写在测试文件中。
  • 期望结果:使用 .after 文件或直接断言。
  • 测试主体:继承平台测试基类或使用测试夹具。

这种方式运行比普通单元测试慢,但能覆盖插件与平台 API 的真实交互。

Gradle 测试依赖

dependencies {
    intellijPlatform {
        testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Platform)
    }
}

如果测试 Java PSI、Java Inspection 等能力,仍然要声明 Java 插件依赖:

dependencies {
    intellijPlatform {
        bundledPlugin("com.intellij.java")
    }
}

测试目录建议

src/test/kotlin/
  com/example/MyInspectionTest.kt
src/test/testData/
  inspection/
    Before.java
    After.java

Fixture 测试示例

class MyInspectionTest : LightJavaCodeInsightFixtureTestCase() {
    override fun getTestDataPath(): String {
        return "src/test/testData"
    }

    fun testWarningAndQuickFix() {
        myFixture.enableInspections(MyStringComparisonInspection())
        myFixture.configureByFile("inspection/Before.java")
        myFixture.checkHighlighting()
        val action = myFixture.findSingleIntention("Replace with equals()")
        myFixture.launchAction(action)
        myFixture.checkResultByFile("inspection/After.java")
    }
}

应该测试什么

  • Action 在不同上下文下是否启用。
  • Inspection 是否在正确位置报问题。
  • Quick Fix 是否生成预期代码。
  • Completion 是否返回正确候选项。
  • Reference 是否能 resolve、rename、find usages。
  • 对不同 IDE 版本的兼容性。

不建议大量 mock

平台官方文档不推荐把 IntelliJ Platform 组件大量 mock 掉。插件代码往往依赖真实项目模型、PSI、VFS、索引和扩展点;过度 mock 会让测试失去价值。

参考来源