Весенние загрузочные тесты в памяти данных не сохраняются между тестами - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь создать набор тестов для проверки отношения @oneToMany, которое у меня есть

У меня есть book_category и книга но моя проблема в том, что у меня есть несколько небольших тестов внутри тестового класса, и кажется, что db (H2) удаляется после каждого теста

вот мой код

@Slf4j
@RunWith(SpringRunner.class)
@DataJpaTest
@TestPropertySource(locations="classpath:test.properties")
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public class BookServiceTest {

    @Autowired
    private BookService bookService;

    @Autowired
    private BookCategoryService categoryService;

    @Test
    @Order(1) 
    public void insertBookCategories() {
        BookCategory cat1 = new BookCategory();
        cat1.setCategoryCode(32);
        cat1.setCategoryName("Category 1");
        BookCategory cat2 = new BookCategory();
        cat2.setCategoryCode(323);
        cat2.setCategoryName("Category 2");
        categoryService.save(cat1);
        categoryService.save(cat2);
        List<BookCategory> categories = categoryService.findAll();
        assertEquals(2, categories.size());
        log.debug("Executed test number 1");
    }

    @Test
    @Order(2) 
    public void createBookWithCategory() {
        Book book = new Book();
        book.setDescription("Test Book");
        book.setNumberOfSales(5);
        book.setTitle("Test title");
        BookCategory cat = categoryService.findByCategoryName("Category 2");
        assertNotNull(cat); <------- this fails!!!!
        assertEquals("Category 2", cat.getCategoryName());
        book.setCategory(cat);
        bookService.save(book);
        log.debug("Executed test number 2");
    }

    @Test
    @Order(3)
    public void deleteCategoryWithBook() {
        BookCategory cat = categoryService.findByCategoryName("Category 2");
        assertEquals("Category 2", cat.getCategoryName());
        categoryService.delete(cat);
        log.debug("Executed test number 3");

    }

    @Test
    @Order(4)
    public void assertBookIsNotNull() {
        Book book = bookService.findByTitle("Test title");
        assertEquals("Test Book", book.getDescription());
        assertNull(book.getCategory());
        log.debug("Executed test number 4");

    }

Я получаю нулевой указатель, когда код в тесте № 2 (createBookWithCategory) пытается извлечь категорию, ранее вставленную в тест 1

Я думал, что добавление аннотации @Transactional поможет сохранить данные до тех пор, пока не закончится весь набор тестов, но он не будет работать

вот мои test.properties

h2.datasource.url=jdbc:h2:mem:somedatebase;DB_CLOSE_DELAY=-1
h2.datasource.username=sa
h2.datasource.password=
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.hbm2ddl.auto=create

Ответы [ 3 ]

3 голосов
/ 25 мая 2019

Тесты, отмеченные @DataJpaTest, уже @Transactional, поэтому добавление @Transactional в явном виде, как вы заметили, не даст никакого эффекта.

Поведение, которое вы видите, связано с тем, что по умолчанию среда тестирования откатывает транзакцию в конце каждого теста. Это сделано для того, чтобы избежать внесения изменений в базу данных в одном тесте, влияющих на поведение другого теста. Обычно это рекомендуется, поскольку позволяет выполнять ваши тесты в любом порядке.

В вашем случае вы заказали тесты и хотите, чтобы изменения, внесенные в одном тесте, повлияли на последующий тест. Вы можете указать тестовой среде зафиксировать транзакцию тестового метода, пометив метод с помощью @Commit. В качестве альтернативы, если вы хотите, чтобы каждый тест в классе фиксировал свою транзакцию, вы можете пометить класс с помощью @Commit.

Подробнее об этом можно прочитать в справочной документации по @Commit, @Rollback и откат транзакции и поведение фиксации .

0 голосов
/ 27 мая 2019

H2 База данных удалит все после того, как было закрыто последнее соединение.Если вы хотите обойти это поведение, вы должны добавить

; DB_CLOSE_DELAY = -1

после конфигурации базы данных, например:

jdbc: h2: mem: test; DB_CLOSE_DELAY = -1

Я НЕ рекомендую этот подход, тесты, зависящие от других тестов, ПЛОХАЯ ПРАКТИКА .Каждый тест должен очищать базу данных, устанавливать собственные ожидания и запускать тесты.

Вы были предупреждены.

0 голосов
/ 25 мая 2019

Тесты Spring Integration по умолчанию откатывают транзакции после каждого теста.(https://docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch09s03.html#testing-tx)

Вы можете комментировать тесты, которые вы не хотите, чтобы их изменения были отменены с помощью @Rollback(false) или @Commit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...