Статьи

Юнит-тестирование JBoss Drools с использованием junit-drools

Недавно я много работал с проектом с использованием JBoss Drools . Я не эксперт Drools — я также не очень убежден в этой структуре или, может быть, только в конкретном случае использования в этом проекте — и мне было довольно сложно писать простые, поддерживаемые модульные тесты для бизнес-правил на основе Drools.

Так родился junit-drools — простая вспомогательная библиотека, позволяющая вам писать тесты Drools без добавления большого количества стандартного кода (как вы можете найти в примерах Drools JBoss Rules 5.X Руководство разработчика ). JUnit-Drools

Установка

Добавьте репозиторий Maven и зависимость к вашему pom.xml:

1
2
3
4
<repository>
    <id>maciejwalkowiak.pl</id>
    <url>https://github.com/maciejwalkowiak/maven-repo/raw/releases/</url>
</repository>
1
2
3
4
5
6
<dependency>
    <groupId>pl.maciejwalkowiak</groupId>
    <artifactId>junit-drools</artifactId>
    <version>1.0</version>
    <scope>test</scope>
</dependency>

использование

junit-drools предоставляет класс DroolsJUnitRunner, который обрабатывает большую часть стандартного кода, который необходимо написать для настройки базы знаний и сеанса Drools.

Давайте рассмотрим следующий пример:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@RunWith(DroolsJUnitRunner.class)
@DroolsFiles(value = "helloworld.drl", location = "/drl/")
public class AppTest {
 
    @DroolsSession
    StatefulSession session;
 
    @Test
    public void should_set_discount() {
        Purchase purchase = new Purchase(new Customer(17));
 
        session.insert(purchase);
        session.fireAllRules();
 
        assertTrue(purchase.getTicket().hasDiscount());
    }
 
    @Test
    public void should_not_set_discount() {
        Purchase purchase = new Purchase(new Customer(22));
 
        session.insert(purchase);
        session.fireAllRules();
 
        assertFalse(purchase.getTicket().hasDiscount());
    }
}
  • @RunWith (DroolsJUnitRunner) — запускает JUnit для проверки правил слюны
  • @DroolsFiles — установить местоположение файлов drl (может быть одним или несколькими) — файлы drl должны быть в пути к классам — @ DroolsFiles # местоположение относительно src/test/resources или src/main/resources
  • @DroolsSession — автоматически вводит сессию Drools в ваш тест перед выполнением

Найдите полный пример с файлом drl в каталоге src / test проекта на Github.

Если вы не хотите использовать DroolsJUnitRunner, например, потому что вы уже хотите использовать Mockito или Spring runner, вы можете инициализировать объекты Drools в методе @Before:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@DroolsFiles(value = "helloworld.drl", location = "/drl/")
public class BeforeMethodBasedTest {
    @DroolsSession
    StatefulSession session;
 
    @Before
    public void initDrools() throws Exception {
        new DroolsInjector().initDrools(this);
    }
 
    @Test
    public void should_set_discount() {
        Purchase purchase = new Purchase(new Customer(17));
 
        session.insert(purchase);
        session.fireAllRules();
 
        assertTrue(purchase.getTicket().hasDiscount());
    }
}

Я не очень разбираюсь в Drools, поэтому библиотека фактически делает то, что было нужно в проекте, с которым я работал. Вы можете добавить свои улучшения, отправив запросы на извлечение в проект Github .