JUnit如何找到正在测试的eclipse插件?

JUnit如何找到正在测试的eclipse插件?,junit,eclipse-plugin,eclipse-jdt,Junit,Eclipse Plugin,Eclipse Jdt,我正在编写一个插件(ClassRefactoringPlugin),用于检查Eclipse3.6.1中的源代码。该插件包含一个CallData类,该类检查Java源文件,并确定使用JDT操作从方法调用哪些Java元素。我为这个类编写了一个JUnit4测试,它也驻留在ClassRefactoringPlugin项目中。当我将其作为JUnit插件测试运行时,我得到: Java Model Exception: Java Model Status [ClassRefactoringPlugin doe

我正在编写一个插件(ClassRefactoringPlugin),用于检查Eclipse3.6.1中的源代码。该插件包含一个CallData类,该类检查Java源文件,并确定使用JDT操作从方法调用哪些Java元素。我为这个类编写了一个JUnit4测试,它也驻留在ClassRefactoringPlugin项目中。当我将其作为JUnit插件测试运行时,我得到:

Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist]
我做错了什么?配置指定使用所有工作区和启用的目标插件启动,ClassRefactoringPlugin位于我的dropins目录中。(尽管衍生工作区不应该识别项目版本的插件吗?)

以下是堆栈跟踪:

!MESSAGE CallData.calculateCalledMethods: Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist]
Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist]
        at org.eclipse.jdt.internal.core.JavaElement.newJavaModelException(JavaElement.java:502)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:246)
        at org.eclipse.jdt.internal.core.Openable.openAncestors(Openable.java:504)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:240)
        at org.eclipse.jdt.internal.core.Openable.openAncestors(Openable.java:504)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:240)
        at org.eclipse.jdt.internal.core.Openable.openAncestors(Openable.java:504)
        at org.eclipse.jdt.internal.core.CompilationUnit.openAncestors(CompilationUnit.java:1170)
        at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:240)
        at org.eclipse.jdt.internal.core.SourceRefElement.generateInfos(SourceRefElement.java:107)
        at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:515)
        at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:252)
        at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:238)
        at org.eclipse.jdt.internal.core.JavaElement.getChildren(JavaElement.java:193)
        at org.eclipse.jdt.internal.core.JavaElement.getChildrenOfType(JavaElement.java:207)
        at org.eclipse.jdt.internal.core.SourceType.getMethods(SourceType.java:403)
        at nz.ac.vuw.ecs.kcassell.utils.EclipseSearchUtils.addDesiredMethods(EclipseSearchUtils.java:333)
        at nz.ac.vuw.ecs.kcassell.utils.EclipseSearchUtils.getMethods(EclipseSearchUtils.java:210)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallData.collectMethodCallData(CallData.java:203)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallData.calculateCalledMethods(CallData.java:176)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallData.collectCallData(CallData.java:151)
        at nz.ac.vuw.ecs.kcassell.callgraph.CallDataTest.testCollectCallData(CallDataTest.java:67)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at junit.framework.TestCase.runTest(TestCase.java:168)
        at junit.framework.TestCase.runBare(TestCase.java:134)
        at junit.framework.TestResult$1.protect(TestResult.java:110)
        at junit.framework.TestResult.runProtected(TestResult.java:128)
        at junit.framework.TestResult.run(TestResult.java:113)
        at junit.framework.TestCase.run(TestCase.java:124)
        at junit.framework.TestSuite.runTest(TestSuite.java:232)
        at junit.framework.TestSuite.run(TestSuite.java:227)
        at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
        at org.eclipse.pde.internal.junit.runtime.UITestApplication$1.run(UITestApplication.java:116)
        at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
        at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134)
        at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3515)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3164)
        at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
        at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
        at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
        at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
        at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
        at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
        at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
        at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
        at org.eclipse.pde.internal.junit.runtime.UITestApplication.start(UITestApplication.java:47)
        at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
        at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
        at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
        at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
        at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
        at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
我想知道这个错误消息是否是在转移视线。调用时出错
IMethod[]methods=type.getMethods()

如果我在那里设置断点并查看调试器的变量视图中的
类型
,我会看到:

CallDataTest (not open) [in CallDataTest.java [in nz.ac.vuw.ecs.kcassell.callgraph [in test [in ClassRefactoringPlugin]]]]
我想知道我是否省略了一些重要的初步步骤,以使该项目可供审查。首先,我尝试激活工作台,如下所示:

public static void activateWorkbench() {
    // possible for PlatformUI.getWorkbench to throw an IllegalStateException
    // if the workbench is not yet started e.g createAndRunWorkbench() has not yet been called
    IWorkbench workbench = PlatformUI.getWorkbench();
    IWorkbenchWindow workbenchWindow =
        workbench.getActiveWorkbenchWindow();
    workbenchWindow.getActivePage();
}
然后我尝试使用其句柄获取类型:

protected IType iType = EclipseUtils.getTypeFromHandle(
        "=ClassRefactoringPlugin/test<nz.ac.vuw.ecs.kcassell.callgraph{CallDataTest.java[CallDataTest");

public static IType getTypeFromHandle(String handle) {
IType type = null;
IJavaElement element = JavaCore.create(handle);
if (element == null) {
    System.err.println("  No element created from " + handle);
} else if (element instanceof IType) {
    type = (IType) element;
}
    return type;
}
protecteditype IType=EclipseUtils.getTypeFromHandle(

“=ClassRefactoringPlugin/test因不同原因出现类似错误。我的错误是在重命名项目中的目标包后开始的。在我尝试paskster的解决方案但未成功后,我开始diggin”

实际的问题是,从清单文件重命名包名并没有按预期工作。我认为这会改变任何地方的一切。但是,旧的包名仍然在测试目录的清单文件中,以及资源中的某些视图中。手动重命名这些包名并重新生成项目后,错误就消失了e

这是另一个问题的公认答案:


由于该问题的负责人投票决定将此答案作为一个带有此问题链接的解决方案,我想我也将其发布在这里。

我有点不确定您到底想在这里做什么,但看起来您正试图为插件编写JUnit测试。是这样吗

根据您正在创建的java元素句柄标识符,在您的工作区中应该有一个名为
ClassRefactoringPlugin
的项目,其中有一个名为test的源文件夹,在名为
nz.ac.vuw.ecs.kcassell.callgraph
的包中有一个名为
CallDataTest
的java类

我猜情况并非如此,您希望引用刚刚创建的插件中的类文件

在执行任何操作之前,需要将项目导入测试工作区,设置其类路径,然后使用句柄标识符访问其内容

我可能误解了您试图做的事情,但看起来您确实试图访问一个工作区中不存在的java文件。如果您能确认这是您想要做的,我可以向您指出一些测试代码,这些代码正是您想要做的


有一些开源项目正是这样做的,您可以借用它们的一些源代码来达到您的目的。我熟悉的一个项目是Groovy Eclipse(因为我是该项目的负责人)

下面是指向我们用于创建和管理测试项目的类的链接:


您可以将部分或全部代码用于自己的测试。请记住在每个测试结束时删除所有项目。

我确认您不需要将导出的插件放入dropins文件夹,因为Eclipse正在使用您在运行JUnit启动配置时编写的插件的项目版本。您可以粘贴fu吗我将堆栈跟踪,因为我认为问题不在于Junit运行配置。如果您能够启动它,我猜测试类在主Junit运行配置选项卡中可用?我不完全确定“主Junit运行配置选项卡”是什么意思?从Eclipse,如果我运行->运行配置,我会得到一个“运行配置”将CallDataTest列为“JUnit插件测试”的窗口。这就是你想知道的吗?我正在编辑原始帖子以包含堆栈跟踪。我已更新了主要帖子中的信息,以反映到更新的Eclipse版本。您好kc2001。您提供了悬赏,并对与您的解决方案类似的问题对我的答案进行了投票。请将我的问题标记为已接受的答案。这是I’’我很遗憾浪费了这些分数。谢谢你。不幸的是,我最初读你的帖子时感到高兴还为时过早。我把我能想到的每个名字都写得一模一样,但仍然存在问题。不过,我没有注意到任何具体的“测试”清单中的信息。我相信您提到的所有先决条件都设置正确。我不明白您对“测试工作区”的引用是什么。我有一个工作区,其中包含我的ClassRefactoringPlugin,它同时包含src和测试文件夹。当我右键单击CallDataTest和“作为JUnit插件测试运行”时,生成了一个新的工作台。如果我在调试模式下这样做,我实际上可以使用调试器在测试中单步执行代码。这就是为什么我想知道错误消息是否有误导性。顺便说一句,我在调试生成的工作区时插件代码运行良好,但在尝试运行JUnit测试时却没有。对。JUnit插件测试生成了一个新的工作区ce,但此工作区最初是空的。您正在尝试访问常规工作区中存在的项目(及其源代码),但不是您的运行时JUnit工作区。我假定在启动运行时(不是JUnit运行时)时工作区,然后您在该工作区中有一个名为
CallDataTest
的项目。如果您想基于它创建
IJavaElement
s,则需要将
CallDataTest
导入JUnit工作区。没有简单的API来实现这一点,但有很多API