На уровне 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();
}
}
}
