尝试在源代码构建的IntelliJ社区上运行no-op`LightCodeInsightFixtureTestCase`时出现`NullPointerException`

时间:2018-06-10 22:23:48

标签: intellij-idea intellij-plugin

我尝试根据this手册为它创建一个简单的IDEA插件和测试用例:

package com.example;

import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;

public class NoopTest extends LightCodeInsightFixtureTestCase {
    public void testNothing() {

    }
}

然后我创建JUnit运行配置,使其运行此类,将工作目录指向D:\idea-community\bin目录(见下文)并根据手册设置VM选项:

-ea -Xbootclasspath/p:../out/classes/production/boot -XX:+HeapDumpOnOutOfMemoryError -Xmx512m -XX:MaxPermSize=320m -Didea.system.path=../test-system -Didea.home.path=../ -Didea.config.path=../test-config -Didea.test.group=ALL_EXCLUDE_DEFINED

然后我在调试模式下运行测试并得到以下错误:

CompositeException (2 nested):
------------------------------
[0]: java.lang.NullPointerException
    at com.intellij.testFramework.IdeaTestUtil.createMockJdk(IdeaTestUtil.java:77)
    at com.intellij.testFramework.IdeaTestUtil.getMockJdk(IdeaTestUtil.java:72)
    at com.intellij.testFramework.IdeaTestUtil.getMockJdk17(IdeaTestUtil.java:85)
    at com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase$1.getSdk(LightCodeInsightFixtureTestCase.java:60)
    at com.intellij.testFramework.LightProjectDescriptor.lambda$createContentEntry$3(LightProjectDescriptor.java:135)
    at com.intellij.openapi.roots.ModuleRootModificationUtil.updateModel(ModuleRootModificationUtil.java:143)
    at com.intellij.testFramework.LightProjectDescriptor.createContentEntry(LightProjectDescriptor.java:134)
    at com.intellij.testFramework.LightProjectDescriptor.lambda$setUpProject$0(LightProjectDescriptor.java:58)
    at com.intellij.openapi.application.WriteAction.run(WriteAction.java:105)
    at com.intellij.testFramework.LightProjectDescriptor.setUpProject(LightProjectDescriptor.java:52)
    at com.intellij.testFramework.LightPlatformTestCase.initProject(LightPlatformTestCase.java:242)
    at com.intellij.testFramework.LightPlatformTestCase.doSetup(LightPlatformTestCase.java:303)
    at com.intellij.testFramework.fixtures.impl.LightIdeaTestFixtureImpl.setUp(LightIdeaTestFixtureImpl.java:37)
    at com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl.lambda$setUp$24(CodeInsightTestFixtureImpl.java:1190)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:19)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:14)
    at com.intellij.testFramework.EdtTestUtilKt.runInEdtAndWait(EdtTestUtil.kt:55)
    at com.intellij.testFramework.EdtTestUtil$Companion.runInEdtAndWait(EdtTestUtil.kt:19)
    at com.intellij.testFramework.EdtTestUtil.runInEdtAndWait(EdtTestUtil.kt)
    at com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl.setUp(CodeInsightTestFixtureImpl.java:1189)
    at com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase.setUp(LightCodeInsightFixtureTestCase.java:76)
    at com.intellij.testFramework.UsefulTestCase.defaultRunBare(UsefulTestCase.java:358)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:19)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:14)
    at com.intellij.testFramework.EdtTestUtilKt$runInEdtAndWait$2.run(EdtTestUtil.kt:59)
    at java.awt.event.InvocationEvent.dispatch$$$capture(InvocationEvent.java:301)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:361)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

[1]: java.lang.AssertionError: setUp() has not been called
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.assertTrue(Assert.java:41)
    at com.intellij.testFramework.fixtures.impl.BaseFixture.tearDown(BaseFixture.java:48)
    at com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl.tearDown(LightTempDirTestFixtureImpl.java:64)
    at com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl.lambda$null$32(CodeInsightTestFixtureImpl.java:1241)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:19)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:14)
    at com.intellij.testFramework.EdtTestUtilKt.runInEdtAndWait(EdtTestUtil.kt:37)
    at com.intellij.testFramework.EdtTestUtil$Companion.runInEdtAndWait(EdtTestUtil.kt:19)
    at com.intellij.testFramework.EdtTestUtil.runInEdtAndWait(EdtTestUtil.kt)
    at com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl.lambda$tearDown$33(CodeInsightTestFixtureImpl.java:1241)
    at com.intellij.testFramework.RunAll.collectExceptions(RunAll.java:60)
    at com.intellij.testFramework.RunAll.run(RunAll.java:52)
    at com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl.tearDown(CodeInsightTestFixtureImpl.java:1247)
    at com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase.tearDown(LightCodeInsightFixtureTestCase.java:88)
    at com.intellij.testFramework.UsefulTestCase.defaultRunBare(UsefulTestCase.java:370)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:19)
    at com.intellij.testFramework.EdtTestUtil$Companion$runInEdtAndWait$1.invoke(EdtTestUtil.kt:14)
    at com.intellij.testFramework.EdtTestUtilKt$runInEdtAndWait$2.run(EdtTestUtil.kt:59)
    at java.awt.event.InvocationEvent.dispatch$$$capture(InvocationEvent.java:301)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:361)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我的设置:

  1. IDEA社区,按照“Check Out And Build Community Edition”手册点击“构建 - 构建项目”在本地构建。源根目录的路径类似于D:\idea-community\,因此存在D:\idea-community\getPlugins.bat。 Git commit是ef98a0ccb
  2. IDEA在调试模式下成功运行。
  3. 此IDEA作为IntelliJ平台插件SDK添加到我的插件项目中。
  4. 我从我的插件项目成功运行IDEA,甚至导航源代码。
  5. 如何在运行测试时修复错误并使其通过?

1 个答案:

答案 0 :(得分:0)

我能够通过删除D:\idea-community\out\production\intellij.pycharm.community\META-INF\PyCharmCorePlugin.xml来解决问题,但这感觉就像是作弊,因为每次构建都会重新创建该文件。

经过进一步调查后,我发现PlatformTestCase.doAutodetectPlatformPrefix()检测到PyCharmCore而不是Idea,看起来在这种情况下没有加载模拟Java SDK(或其他),因此{{1 }}

我在JetBrains论坛here(2009年),here(2012年)和there(2014年)发现了类似问题。它看起来像测试is a recent thing中的平台自动检测(从2015年开始)。此外,它看起来覆盖了我作为JVM选项传递的任何NullPointerException,因此我没有看到任何更好的解决方案。