На уровне Middleware можно создавать интеграционные тесты, которые выполняются в полнофункциональном контейнере Spring с подключением к базе данных. В тестах такого типа можно выполнять код любого слоя внутри Middleware - от сервисов до ORM.
Для создания интеграционных тестов в модуле core проекта приложения должен быть создан базовый класс - наследник CubaTestCase
. В этом классе должны быть переопределены методы инициализации доступа к данным и получения списка файлов конфигурации.
Например:
public class SalesTestCase extends CubaTestCase { @Override protected void initDataSources() throws Exception { Class.forName("org.postgresql.Driver"); TestDataSource ds = new TestDataSource("jdbc:postgresql://localhost/sales_test", "cuba", "cuba"); TestContext.getInstance().bind("java:comp/env/jdbc/CubaDS", ds); } @Override protected List<String> getTestAppProperties() { String[] files = { "cuba-app.properties", "app.properties", "test-app.properties", }; return Arrays.asList(files); } }
В качестве базы данных рекомендуется использовать отдельную тестовую БД, которую можно создавать, например, следующей задачей
в build.gradle
:
configure(coreModule) { ... task createTestDb(dependsOn: assemble, description: 'Creates local Postgres database for tests', type: CubaDbCreation) { dbms = 'postgres' dbName = 'sales_test' dbUser = 'cuba' dbPassword = 'cuba' }
Класс CubaTestCase
содержит следующие поля и методы, которые можно использовать в коде тестов:
-
persistence
- ссылка на интерфейсPersistence
-
metadata
- ссылка на интерфейсMetadata
-
deleteRecord()
- метод, который удобно использовать вtearDown()
для удаления тестовых объектов из БД.
Пример теста, проверяющего чтение сущностей из базы данных:
public class CustomerLoadTest extends SalesTestCase { private UUID customerId; @Override public void setUp() throws Exception { super.setUp(); persistence.createTransaction().execute(new Transaction.Runnable() { @Override public void run(EntityManager em) { Customer customer = new Customer(); customerId = customer.getId(); customer.setName("testCustomer"); em.persist(customer); } }); } @Override public void tearDown() throws Exception { deleteRecord("SALES_CUSTOMER", customerId); super.tearDown(); } public void test() { Transaction tx = persistence.createTransaction(); try { EntityManager em = persistence.getEntityManager(); TypedQuery<Customer> query = em.createQuery( "select c from sales$Customer c", Customer.class); List<Customer> list = query.getResultList(); tx.commit(); assertTrue(list.size() > 0); } finally { tx.end(); } } }