Тестирование: объект создан, но не найден в базе данных - PullRequest
0 голосов
/ 06 февраля 2012

По сути, это вопрос о тесте JUnit, в котором вы создаете сущность в методе @Before, но не можете найти ее в реальном методе теста.Я пытался выяснить, что происходит, и любая помощь будет очень признательна.

По сути, это класс JUnit, подобный следующему:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"myConfiFile.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class DummyTest {

@Before
public void setUp() {
    // Create an entity here and call .save()
}

@Test
public void testCountMsisdnNumberPlans() {
    int howManyInstances = dao.countInstancesOfEntity();
}
}

Код DAO довольнопросто:

@Transactional(readOnly = true)
public Integer countInstancesOfEntity(Integer idhlr) {
    return ((BigDecimal) em.createNativeQuery("SELECT COUNT(*) FROM ENTITY")
        .getSingleResult()).intValue();
}

В setUp () мы создаем одну сущность, но код DAO продолжает возвращать 0. Любой комментарий был бы действительно хорош.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

SpringJUnit4ClassRunner выполняет @Before и @After внутри той же транзакции, что и метод теста.Таким образом, изменения, внесенные в контекст постоянства в @Before, не сбрасываются в базу данных перед запуском тестового метода.Неявная очистка перед выполнением запроса также не происходит, поскольку транзакция настроена только для чтения.

Итак, у вас есть несколько вариантов:

  • Удалить readOnly = true, это должно сделатьразрешить автоматическую очистку перед выполнением запроса
  • Добавить явное flush() к @Before, это должно привести к принудительной очистке, даже если транзакция только для чтения
  • Использовать @BeforeTransaction вместо @Before.Обратите внимание, что этот метод выполняется вне транзакции, поэтому на него не влияет параметр defaultRollback, и он требует ручного управления транзакциями.
0 голосов
/ 06 февраля 2012

Я думаю, это потому, что у вас defaultRollback = true.

Транзакция оборачивается вокруг отдельного вызова метода, что в данном случае означает, что setUp и ваш тест находятся в отдельных транзакциях.изменяя это на ложное, или даже удаляя его.

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