How does JUnit find the eclipse plugin under test?

I am writing a plugin (ClassRefactoringPlugin) that examines the source code in Eclipse 3.6.1. The plugin contains the CallData class, which parses the Java source file and calculates which Java elements are called from a method that uses JDT operations. I wrote a JUnit 4 test for this class, which is also in the ClassRefactoringPlugin project. When I ran it as a JUnit test case, I got:

Java Model Exception: Java Model Status [ClassRefactoringPlugin does not exist] 

How am I wrong? The configuration indicates a start with all workspaces and target plugins enabled, and ClassRefactoringPlugin in my dropins directory. (Although shouldn't the plug-in project version be recognized by the generated workspace?)

Here's the stack trace:

 !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) 

I am wondering if the error message could be a red herring. An error occurred while making the call IMethod[] methods = type.getMethods();

If I set a breakpoint there and look at type in the Variables view of the debugger, I see:

 CallDataTest (not open) [in CallDataTest.java [in nz.ac.vuw.ecs.kcassell.callgraph [in test [in ClassRefactoringPlugin]]]] 

I wonder if I do not exclude some important preliminary step to make the project accessible for study. Firstly, I am trying to activate a workbench, for example:

 public static void activateWorkbench() { // possible for PlatformUI.getWorkbench to throw an IllegalStateException // if the workbench is not yet started eg createAndRunWorkbench() has not yet been called IWorkbench workbench = PlatformUI.getWorkbench(); IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow(); workbenchWindow.getActivePage(); } 

Then I try to get the type using its descriptor:

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

I am new to plugin development, so any help would be greatly appreciated.

Cheers, Keith

+2
source share
2 answers

I'm a little unsure what you are trying to do here, but it looks like you are trying to write a JUnit test for your plugin. Is it correct?

According to the ID of the descriptor of the java element you are creating, there should be a project called ClassRefactoringPlugin in your workspace and there, this is the source folder named test and the java class called CallDataTest in the package called nz.ac.vuw.ecs.kcassell.callgraph .

I assume this is not the case and you want to reference the class file in the newly created plugin.

Before you can do this, you need to import the project into the workspace of the test, set its path to the class, and then you can access its contents using descriptor identifiers.

I may not understand what you are trying to do, but it looks like you are trying to access a java file that does not exist in your workspace. If you can confirm that this is what you want to do, I can point you to some test code that does exactly what you want.


There are several open source projects that do just that, and you can take some of your source code for your purpose. The project I am familiar with is Groovy -Eclipse http://groovy.codehaus.org/Eclipse+Plugin (since I am leading this project).

Here is a link to the class that we use to create and manage test projects:

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

You can use some or all of this code for your own tests. Just remember to delete all projects at the end of each test.

+1
source

There was a similar error for various reasons. My mistake started after renaming the target package in the project. After I tried the solution from paskster without success, I started diggin '.

The actual problem was that renaming the package name from the manifest file does not work properly. I thought it would hurt everything. However, the old package name was still in the manifest file in the test directory and in some views in the resources. After renaming these files manually and restoring the project, the error disappeared.

This is an accepted answer to another question: Java model exception : Java model state [gen [in MyApp] does not exist] after the Eclipse Android Clean project

Since the owner of this question raised this answer as a solution with reference to this question, I thought I would post it here too.

0
source

All Articles