I have continued to try to isolate the problem that I have previously described, where my RCP application that calls Drools runs properly, but am unable to Unit test.  Can reproduce the problem simply and am hoping someone can lend some insight.

I started by creating a simple Drools project that had a JUnit 4 test in it;  this runs.  It contains two java files and a DRL file. (Shown at very bottom of this post)

I then created a Hello World RCP application from the Eclipse templates.  I copied the Drools project files (2 Java files and 1 DRL file) into the same package as my RCP stuff.  When I run the test, I get the following error, which is exactly the same error I have been getting with my much more complicated project:

java.lang.NullPointerException
at org.mvel.optimizers.OptimizerFactory.<clinit>(OptimizerFactory.java:43)
at org.drools.rule.builder.dialect.mvel.MVELDialect.init(MVELDialect.java:142)
at org.drools.compiler.DialectRegistry.initAll(DialectRegistry.java:49)
at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:146)
at org.drools.compiler.PackageBuilder.<init>(PackageBuilder.java:108)
at rcp_with_drool.mikeTest..setUp(mikeTest.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
[MVEL] Notice: Possible incorrect version of ASM present (3.0 required).  Disabling JIT compiler.  Reflective Optimizer will be used.

I then removed all the source files relating to the RCP itself, and the error persists.  If I now remove the plugin dependencies from this project from the build path, the problem goes away and the tests run.  If I add the plugin dependencies back into the project, the error resumes.  Finally, if I make my ORIGINAL Drools project depend on this second one with the plugin dependencies, the test fails there too.  If I remove the plugin dependencies, the tests run.

The plugin dependencies are:
org.eclipse.ui
org.eclipse.swt
CodeProSWTFragment
org.eclipse.swt.carbon.macosx
org.eclipse.jface
org.eclipse.core.commands
org.eclipse.ui.workbench
org.eclipse.core.runtime
org.eclipse.osgi
org.eclipse.equinox.common
org.eclipse.core.jobs
runtime_registry_compatibility
org.eclipse.equinox.registry
org.eclipse.equinox.preferences
org.eclipse.core.contenttype
org.eclipse.equinox.app

Thanks for any assistance.

Here are the two java files and the rules file:

package rcp_with_drool;

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import rcp_with_drool.DroolsTest.Message;

public class mikeTest {
public static RuleBase ruleBase;
public static WorkingMemory workingMemory;
public static Message message;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
message = new Message();
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( "Sample.drl" ) );
PackageBuilder builder = new PackageBuilder();
try {
builder.addPackageFromDrl(source);
} catch (DroolsParserException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}


Package pkg = builder.getPackage();
ruleBase = RuleBaseFactory.newRuleBase();
try {
ruleBase.addPackage( pkg );
} catch (Exception e) {
e.printStackTrace();
}
workingMemory = ruleBase.newStatefulSession();
}

@After
public void tearDown() throws Exception {
}

@Test
public void testMain() {
        //Message message = new Message();
        message.setMessage(  "Hello World" );
        message.setStatus( Message.HELLO );
        workingMemory.insert( message );
        assertEquals("Message status set", message.getStatus(), Message.HELLO);
        workingMemory.fireAllRules();
        assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}

@Test
public void testMain1() {
        //Message message = new Message();
        message.setMessage(  "Hello World" );
        message.setStatus( Message.HELLO );
        workingMemory.insert( message );
        assertEquals("Message status set", message.getStatus(), Message.HELLO);
        workingMemory.fireAllRules();
        assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}
@Test
public void testMain2() {
        //Message message = new Message();
        message.setMessage(  "Hello World" );
        message.setStatus( Message.HELLO );
        workingMemory.insert( message );
        assertEquals("Message status set", message.getStatus(), Message.HELLO);
        workingMemory.fireAllRules();
        assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}
@Test
public void testMain3() {
        //Message message = new Message();
        message.setMessage(  "Hello World" );
        message.setStatus( Message.HELLO );
        workingMemory.insert( message );
        assertEquals("Message status set", message.getStatus(), Message.HELLO);
        workingMemory.fireAllRules();
        assertEquals("Message status set",message.getStatus(),Message.GOODBYE);
}


}

package rcp_with_drool;

import java.io.InputStreamReader;
import java.io.Reader;

import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;

/**
 * This is a sample file to launch a rule package from a rule source file.
 */
public class DroolsTest {

    public static final void main(String[] args) {
        try {
        
         //load up the rulebase
            RuleBase ruleBase = readRule();
            WorkingMemory workingMemory = ruleBase.newStatefulSession();
            
            //go !
            Message message = new Message();
            message.setMessage(  "Hello World" );
            message.setStatus( Message.HELLO );
            workingMemory.insert( message );
            workingMemory.fireAllRules();   
            
            
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    /**
     * Please note that this is the "low level" rule assembly API.
     */
private static RuleBase readRule() throws Exception {
//read in the source
Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/Sample.drl" ) );
//optionally read in the DSL (if you are using it).
//Reader dsl = new InputStreamReader( DroolsTest.class.getResourceAsStream( "/mylang.dsl" ) );

//Use package builder to build up a rule package.
//An alternative lower level class called "DrlParser" can also be used...
PackageBuilder builder = new PackageBuilder();

//this wil parse and compile in one step
//NOTE: There are 2 methods here, the one argument one is for normal DRL.
builder.addPackageFromDrl( source );

//Use the following instead of above if you are using a DSL:
//builder.addPackageFromDrl( source, dsl );
//get the compiled package (which is serializable)
Package pkg = builder.getPackage();
//add the package to a rulebase (deploy the rule package).
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
return ruleBase;
}
public static class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
public int getStatus() {
return this.status;
}
public void setStatus( int status ) {
this.status = status;
}
}
    
}

package glucose.rules

 

import rcp_with_drool.DroolsTest.Message;

 

rule "Hello World"
when
m : Message( status == Message.HELLO, message : message )
then
System.out.println( message ); 
m.setMessage( "Goodbye crueller world" );
m.setStatus( Message.GOODBYE );
update( m );
end

rule "GoodBye"
no-loop true
when
m : Message( status == Message.GOODBYE, message : message )
then
System.out.println( message ); 
m.setMessage( message );
end