Недавно я много работал с проектом с использованием JBoss Drools . Я не эксперт Drools — я также не очень убежден в этой структуре или, может быть, только в конкретном случае использования в этом проекте — и мне было довольно сложно писать простые, поддерживаемые модульные тесты для бизнес-правил на основе Drools.
Так родился junit-drools — простая вспомогательная библиотека, позволяющая вам писать тесты Drools без добавления большого количества стандартного кода (как вы можете найти в примерах Drools JBoss Rules 5.X Руководство разработчика ). 
Установка
Добавьте репозиторий 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 .