2010-07-29 44 views
2

我正在编写一个检查Eclipse 3.6.1中的源代码的插件(ClassRefactoringPlugin)。该插件包含一个CallData类,该类检查Java源文件并找出哪些Java元素是从使用JDT操作的方法中调用的。我为这个也写在ClassRefactoringPlugin项目中的类写了一个JUnit 4测试。当我将它作为JUnit插件测试运行时,得到:JUnit如何找到正在测试的eclipse插件?

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();

如果我设置一个断点,并期待在调试器的变量视图type出现的错误,我看到:

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; 
} 

我是新来的插件开发,因此任何帮助将是非常感激。

干杯, 基思

+0

我确认您不需要将导出的插件放​​在dropins文件夹中,因为Eclipse使用的是您在运行JUnit Launch配置时编写的插件的项目版本。你可以粘贴完整的堆栈跟踪,因为我不认为这个问题是关于Junit运行配置。如果您能够赞扬它,我猜测测试课程在主Junit运行配置选项卡中可用? – 2010-07-29 09:02:27

+0

我不完全确定“主Junit运行配置选项卡”是什么意思?在Eclipse中,如果我执行Run-> Run Configurations,则会出现一个“Run Configurations”窗口,其中列出CallDataTest为“JUnit插件测试”。这是你想知道的吗? 我正在编辑原始帖子以包含堆栈跟踪。 – kc2001 2010-07-29 22:55:45

+0

我已经更新了主帖子中的信息,以反映更新的Eclipse版本。 – kc2001 2011-04-14 02:14:35

回答

1

我有点不确定你在这里做什么,但它看起来像你试图为你的插件写一个JUnit测试。这是正确的吗?

根据正在创建Java元素手柄标识符,应该有一个叫做ClassRefactoringPlugin在您的工作区,并在那里的项目,被称为测试的源文件夹,并呼吁CallDataTest在一个名为nz.ac.vuw.ecs.kcassell.callgraph包的Java类。

我猜测事实并非如此,你想引用刚创建的插件中的类文件。

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

我可能会误解你正在尝试做的事情,但它看起来好像你试图访问工作区中不存在的java文件。如果您可以确认这是您想要做的事情,我可以为您指出一些测试代码,它完全符合您的要求。


有一些开源项目可以做到这一点,你可以借用他们的一些源代码来达到你的目的。我熟悉的一个项目是Groovy-Eclipse http://groovy.codehaus.org/Eclipse+Plugin(因为我是该项目的主角)。

这里是我们用来创建和管理测试项目类的链接:

https://svn.codehaus.org/groovy/eclipse/trunk/ide-test/org.codehaus.groovy.eclipse.tests/src/org/codehaus/groovy/eclipse/test/TestProject.java

你可以使用一些或所有这些代码对你自己的测试。只记得在每次测试结束时删除所有项目。

+0

我相信你提到的所有前提条件都是正确的。我不明白你是否参考了“测试工作区”。我有一个包含我的ClassRefactoringPlugin的工作空间,它具有src和测试文件夹。当我右键单击CallDataTest和“作为JUnit插件测试运行”时,会产生一个新的工作台。如果我在调试模式下这样做,我实际上可以使用调试程序遍历测试中的代码。这就是为什么我想知道错误信息是否会引起误解。顺便说一句,我的插件代码运行良好,当我调试它时产生的工作区,而不是当我尝试运行JUnit测试。 – kc2001 2011-04-19 05:59:38

+0

对。 JUnit插件测试产生一个新的工作区,但这个工作区最初是空的。您正尝试访问常规工作区中存在的项目(及其源代码),但不是您的运行时JUnit工作区。我假设当你启动一个运行时(不是JUnit运行时)工作区时,那么你在该工作区中有一个名为'CallDataTest'的项目。如果你想创建一个基于它的'IJavaElement',你需要将'CallDataTest'导入到你的JUnit工作区。有没有简单的API来做到这一点,但有许多开源项目需要做类似的事情。 – 2011-04-19 19:34:12

+0

已更新我的答案,以包含一些示例源代码的链接。 – 2011-04-19 19:37:40

0

已经为不同的原因,类似的错误。重命名项目中的目标包后,我的错误开始了。在我尝试从paskster解决方案没有成功后,我开始diggin'。

实际的问题是,从清单文件重命名软件包名称没有按预期工作。我认为这会改变一切。但是,旧的软件包名称仍位于测试目录中的清单文件中,并且位于资源中的某些视图中。手动重命名并重建项目后,错误消失了。

这是另一个问题,接受的答案: Java Model Exception: Java Model Status [gen [in MyApp] does not exist] after Eclipse Android project Clean

由于这个问题上投这个答案是一个链接到这个问题的解决方案的拥有者,我想我会在这里发布,以及。

+0

不幸的是,我读起你的帖子最初的喜悦还为时过早。我使每个名字都一致,我可以想到并仍然存在问题。但是,我没有注意到MANIFEST中的任何特定“测试”信息。 – kc2001 2011-04-19 05:49:00