Need explanation on the necessity of a prior flushing to avoid false positives whenTesting with Spring ?

In the spring documentation regarding testing, it states:

Avoid false positives when testing ORM code

When you test code involving an ORM framework such as JPA or Hibernate, flush the underlying session within test methods which update the state of the session. Failing to flush the ORM framework's underlying session can produce false positives: your test may pass, but the same code throws an exception in a live, production environment. In the following Hibernate-based example test case, one method demonstrates a false positive and the other method correctly exposes the results of flushing the session.

Can someone explain why i need to call flush?

9
задан menjaraz 14 December 2011 в 21:40
поделиться

2 ответа

Что ж, вы на самом деле пропустили интересную часть, пример :) Вот он:

// ...

@Autowired
private SessionFactory sessionFactory;

@Test // no expected exception!
public void falsePositive() {
    updateEntityInHibernateSession();
    // False positive: an exception will be thrown once the session is
    // finally flushed (i.e., in production code)
}

@Test(expected = GenericJDBCException.class)
public void updateWithSessionFlush() {
    updateEntityInHibernateSession();
    // Manual flush is required to avoid false positive in test
    sessionFactory.getCurrentSession().flush();
}

// ...

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

Например, база данных может вернуть ошибку из-за, скажем, нарушения ограничения, и если вы не попадете в базу данных, вы не проявите правильное поведение, как в falsePositive () метод тестирования выше. Этот метод тестирования должен завершиться ошибкой или ожидать исключения, но он просто пройдет. С другой стороны, другой метод тестирования с промывкой действительно проверяет реальное поведение. Следовательно, необходимо очистить .

3
ответ дан 3 November 2019 в 07:11
поделиться

В документации Spring используется неверная концепция. Это было ясно,

но тот же самый код выдает исключение в реальной производственной среде

А вот и википедия

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

Если вы видите образец, предоставленный Spring, производственная среда выдает исключение (A GenericJDBCException), , но оно не обнаружено. Чтобы увидеть, вы должны вызвать базовую фиксацию при использовании какого-либо поставщика ORM.

Определение тестовых шаблонов XUnit

Ситуация, в которой тест проходит успешно, даже если тестируемая система не работает должным образом.

Таким образом, верная концепция ложнаОтрицательный

@Test // no expected exception!
public void falseNegative() {
1
ответ дан 3 November 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: