[rules-users] JUnit testing
Marcus Ilgner
marcus.ilgner at gmail.com
Mon May 19 16:28:37 EDT 2008
On Mon, May 19, 2008 at 6:00 PM, Edson Tirelli <tirelli at post.com> wrote:
>
> Marcus, can you please open a JIRA for us, anyway, so that we can improve
> that code spot to check for nulls? This will avoid such problems in the
> future.
>
> If you want to contribute a patch, it is also welcome.
>
> Thanks.
> Edson
>
Of course I'll gladly write a patch for this issue. Although I'm head
over heels in my current project, there's a holiday coming up this
week, so you may expect the patch by the end of the week.
Cheers
Marcus
> 2008/5/19 Marcus Ilgner <marcus.ilgner at gmail.com>:
>>
>> Hi Edson,
>>
>> thank you very much for testing this! Since I could not discern any
>> differences between your approach and mine, I decided to resolve the
>> issue manually by inserting a work-around in my test routine which
>> sets the context class loader for the current thread before calling
>> the method under test.
>>
>> if (Thread.currentThread().getContextClassLoader() == null) {
>>
>> Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
>> }
>>
>> My guess is that the custom JUnit 4 class runner
>> (SpringJUnit4ClassRunner) somehow is responsible for the faulty
>> behaviour.
>>
>> Thanks again
>> Marcus
>>
>>
>> On Mon, May 19, 2008 at 3:09 PM, Edson Tirelli <tirelli at post.com> wrote:
>> >
>> > All,
>> >
>> > I see that the code in that spot is weak and could be improved.
>> > Although,
>> > using drools 4.0.7, I successfully created a junit 4 test that I paste
>> > bellow. Also, the whole drools code is tested with junit 3 and we have
>> > no
>> > problems. For instance, look at our integration tests here:
>> >
>> >
>> > http://anonsvn.labs.jboss.com/labs/jbossrules/branches/4.0.x/drools-compiler/src/test/java/org/drools/integrationtests/
>> >
>> > The code I used to create the junit 4 test is based on the default
>> > example create by the drools plugin + the snippet you showed bellow:
>> >
>> > @Test
>> > public void testRuleBase() {
>> > try {
>> >
>> > //load up the rulebase
>> > RuleBase ruleBase = readRule();
>> > StatefulSession workingMemory =
>> > ruleBase.newStatefulSession();
>> >
>> > //go !
>> > Message message = new Message();
>> > message.setMessage( "Hello World" );
>> > message.setStatus( Message.HELLO );
>> > workingMemory.insert( message );
>> > workingMemory.fireAllRules();
>> > workingMemory.dispose();
>> >
>> > } catch (Throwable t) {
>> > t.printStackTrace();
>> > Assert.fail("Something is wrong: "+t.getMessage());
>> > }
>> > }
>> >
>> > /**
>> > * Please note that this is the "low level" rule assembly API.
>> > */
>> > private RuleBase readRule() throws Exception {
>> > //read in the source
>> > Reader source = new InputStreamReader(
>> > DroolsTest.class.getResourceAsStream( "/Sample.drl" ) );
>> >
>> > PackageBuilderConfiguration conf = new
>> > PackageBuilderConfiguration();
>> > JavaDialectConfiguration javaConf = (JavaDialectConfiguration)
>> > conf.getDialectConfiguration("java");
>> > javaConf.setCompiler(JavaDialectConfiguration.ECLIPSE);
>> > javaConf.setJavaLanguageLevel("1.5");
>> >
>> > PackageBuilder builder = new PackageBuilder( conf );
>> > builder.addPackageFromDrl( source );
>> >
>> > RuleBase ruleBase = RuleBaseFactory.newRuleBase();
>> > ruleBase.addPackage( builder.getPackage() );
>> > return ruleBase;
>> > }
>> >
>> > Hope it helps,
>> > Edson
>> >
>> >
>> > 2008/5/19 Marcus Ilgner <marcus.ilgner at gmail.com>:
>> >>
>> >> Hi list,
>> >>
>> >> I'm reviving this thread because I happen to have the same problem.
>> >>
>> >> On Sun, Mar 23, 2008 at 7:34 PM, Mike Dean <mdean77 at comcast.net> wrote:
>> >> >
>> >> > Thanks (months later!). I have cut down my code example below to
>> >> > show
>> >> > this
>> >> > issue more clearly:
>> >> >
>> >> >
>> >> > John J. Franey wrote:
>> >> >>
>> >> >> NullPointerException on line 146 means classLoader is null. That
>> >> >> is
>> >> >> odd.
>> >> >> I have no idea why the code that gets classLoader won't work in
>> >> >> eclipse's
>> >> >> junit runtime, but does when run in your eclipse plugin.
>> >>
>> >> It seems indeed like during JUnit tests, the context classloader of
>> >> the thread gets not set (null).
>> >>
>> >> The code leading up to the problem is as follows:
>> >> PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
>> >> JavaDialectConfiguration javaConf = (JavaDialectConfiguration)
>> >> conf.getDialectConfiguration("java");
>> >> javaConf.setCompiler(JavaDialectConfiguration.ECLIPSE);
>> >> javaConf.setJavaLanguageLevel("1.5");
>> >> RuleBase ruleBase = RuleBaseFactory.newRuleBase();
>> >>
>> >> The resulting stacktrace is:
>> >> java.lang.NullPointerException
>> >> at
>> >>
>> >> org.drools.RuleBaseConfiguration.instantiateClass(RuleBaseConfiguration.java:569)
>> >> at
>> >>
>> >> org.drools.RuleBaseConfiguration.determineConsequenceExceptionHandler(RuleBaseConfiguration.java:561)
>> >> at
>> >> org.drools.RuleBaseConfiguration.init(RuleBaseConfiguration.java:220)
>> >> at
>> >> org.drools.RuleBaseConfiguration.<init>(RuleBaseConfiguration.java:133)
>> >> at
>> >> org.drools.common.AbstractRuleBase.<init>(AbstractRuleBase.java:147)
>> >> at
>> >> org.drools.reteoo.ReteooRuleBase.<init>(ReteooRuleBase.java:124)
>> >> at
>> >> org.drools.reteoo.ReteooRuleBase.<init>(ReteooRuleBase.java:101)
>> >> at
>> >> org.drools.RuleBaseFactory.newRuleBase(RuleBaseFactory.java:57)
>> >> at
>> >> org.drools.RuleBaseFactory.newRuleBase(RuleBaseFactory.java:38)
>> >>
>> >> Has anyone set up Drools and JUnit successfully? Maybe we forgot to
>> >> set up the environment properly?
>> >>
>> >> Best regards
>> >> Marcus
More information about the rules-users
mailing list