dans le Documentation de printemps concernant les tests , il indique: P>
Évitez les faux positifs lorsque vous testez orm Code p>
Lorsque vous testez le code impliquant un Cadre orm tel que jpa ou Hibernate, rincer le sous-jacent session dans les méthodes de test qui mettre à jour l'état de la session. Omet de rincer le framework de ORM La session sous-jacente peut produire de faux positifs: votre test peut passer, mais le Même code jette une exception dans un Vivre, environnement de production. Dans le Suivre un test d'exemple basé sur l'hibernate cas, une méthode démontre un faux positif et l'autre méthode expose correctement les résultats de rincer la session. P> blockQuote>
Quelqu'un peut-il expliquer pourquoi j'ai besoin d'appeler Flush? p>
4 Réponses :
Eh bien, vous avez réellement ignoré la partie intéressante, l'exemple :) Ici, c'est le cas:
// ... @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(); } // ...
Pascal, merci. Quelle est la recommandation ici? Flush () Après tout enregistrement et évitez le cache du premier niveau lorsque la performance n'a pas beaucoup de problème? Et devrions-nous appeler flush après avoir appelé la méthode sous test en dehors de l'appel de la méthode ou même à l'intérieur? Comment déroutant!
La documentation de printemps utilise le mauvais concept. Il a été clair
Mais le même code
jette une exception dans un environnement de production en direct fort> p> BlockQuote> Voici Wikipedia P>
Erreur de type II, également appelée "erreur du deuxième type", une erreur μ², ou un "faux négatif" fort>: l'erreur de défaillance de rejeter une hypothèse nulle lorsqu'il est dans fait non vrai. Un exemple de ce serait si un test montre qu'une femme n'est pas enceinte, quand en réalité, elle est. strong> p> blockQuote>
Si vous voyez l'échantillon fourni par le ressort, l'environnement de production jette une exception (une exception générique),
mais elle n'a pas été détectée forte>. Afin de voir, vous devez appeler strong> le commettre sous-jacent lors de l'utilisation d'un fournisseur ORM. P> Modèles de test Xunit Définition P>
une situation dans laquelle un test passe forte> même si le système sous test ne fonctionne pas correctement p>. p>. blockQuote> donc le concept de droite strong> est falsenenegative p>
xxx pré> p>
Annotation de tests de ressort avec @TransAderal est pratique, mais ce n'est pas la manière dont votre code de production sera exécuté. L'annotation @TransActional démarrera une transaction avant d'exécuter votre méthode de test et la réchauffera lorsque la méthode de test se termine.
tandis que comme commit est précédé d'une rinchon, le rouleau n'est pas, donc un rinçage manuel est un Mécanisme de sécurité permettant à toutes les modifications de l'entité est traduit vers des relevés SQL. p>
une conception plus appropriée serait de dessiner explicitement les limites de la transaction comme ceci: P>
@Test public void testRootObjects() { final Company newCompany = new Company(); newCompany.setName("TV Company"); final Long companyId = transactionTemplate.execute(new TransactionCallback<Long>() { @Override public Long doInTransaction(TransactionStatus transactionStatus) { entityManager.persist(newCompany); return newCompany.getId(); } }); Company detachedCompany = transactionTemplate.execute(new TransactionCallback<Company>() { @Override public Company doInTransaction(TransactionStatus transactionStatus) { Company attachedCompany = entityManager.find(Company.class, companyId); assertEquals(newCompany, attachedCompany); assertEquals(newCompany.hashCode(), attachedCompany.hashCode()); return attachedCompany; } }); assertEquals(newCompany, detachedCompany); assertEquals(newCompany.hashCode(), detachedCompany.hashCode()); }
Est-ce que quelqu'un a vérifié avec l'annotation @TransactionConfiguration? Si vous utilisez @Transaction annotation conduite dans votre projet, vous pouvez simplement définir