CER-Testcodegenerator

Der bereits vorgestellte CER-Regelwerkinterpreter lässt über Zeichenfolgen Verweise auf Regelklassen- und Attributnamen zu.

Dies ermöglicht zwar eine vollständig dynamische Konfiguration von Regelwerken, aber es kann im Rahmen von Tests umständlich sein, Zeichenfolgen zu verwenden und Attributwerte umzusetzen. Falls Sie eine Regelklasse oder einen Attributnamen falsch typisieren bzw. den falschen Umsetzungstyp verwenden, wird der Code zwar möglicherweise problemlos kompiliert, führt jedoch während der Laufzeit zu Fehlern.

CER enthält einen Codegenerator, der für Ihre Regelklassen Java-Wrapperklassen generieren kann. Diese generierten Klasssen können das Schreiben des Testcodes vereinfachen und dem Comiler die Erkennung von Problemen ermöglichen, die andernfalls erst zur Laufzeit auftreten würden.

Der Code für die Ausführung des Regelwerks "HelloWorldRuleSet" wird wie folgt umgeschrieben:

Abbildung 1. Ausführung von Regeln mit den von CER generierten Testregelklassen
package curam.creole.example;

import junit.framework.TestCase;
import curam.creole.execution.session.RecalculationsProhibited;
import curam.creole.execution.session.Session;
import curam.creole.execution.session.Session_Factory;
import
 curam.creole.execution.session.StronglyTypedRuleObjectFactory;
import curam.creole.ruleclass.HelloWorldRuleSet.impl.HelloWorld;
import
 curam.creole.ruleclass.HelloWorldRuleSet.impl.HelloWorld_Factory;
import curam.creole.storage.inmemory.InMemoryDataStorage;

public class TestHelloWorldCodeGen extends TestCase {

  /**
   * Runs the class as a stand-alone Java application.
   */
  public static void main(final String[] args) {

    final TestHelloWorldCodeGen testHelloWorld =
        new TestHelloWorldCodeGen();
    testHelloWorld.testUsingGeneratedTestClasses();

  }

  /**
   * A simple test case, using the CER-generated test classes for
   * strong typing and ease of coding tests.
   */
  public void testUsingGeneratedTestClasses() {

    /* start a strongly-typed session */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new StronglyTypedRuleObjectFactory()));

    /*
     * create a rule object instance of the required rule class, by
     * using its generated factory
     */
    final HelloWorld helloWorld =
        HelloWorld_Factory.getFactory().newInstance(session);

    /*
     * use the generated accessor to get at the "greeting" rule
     * attribute - no cast necessary, and any error in the
     * attribute name would lead to a compile error
     */
    final String greeting = helloWorld.greeting().getValue();

    System.out.println(greeting);
    assertEquals("Hello, world!", greeting);
  }

}

Im Vergleich mit dem Code für TestHelloWorldInterpreted lässt sich Folgendes feststellen:

Achtung: Der generierte Code ist nur für die Verwendung in Testumgebungen gedacht, bei denen es vor allem darauf ankommt, Änderungen am Code erneut zu kompilieren.

Der generierte Code ist nicht maschinenübergreifend portierbar, da er absolute Pfade für die Regelwerke auf der lokalen Maschine enthält.

Insbesondere darf der generierte Code nicht in einer Produktionsumgebung eingesetzt werden, in der sich Regelwerke dynamisch ändern können.