Comment puis-je réinitialiser mon état de base de données après chaque unité de test sans test d'une transaction?
Je suis en utilisant le Printemps 3.1.1.LIBÉRATION, Hibernate 4.1.0.Final, JPA 2, JUnit 4.8.1, et HSQL 2.2.7. Je veux exécuter certains tests JUnit sur mes méthodes de service, et après chaque essai, je voudrais toutes les données écrites dans la base de données en mémoire pour être restaurées. Cependant, je ne veux PAS l'ensemble de test pour être traitée comme une transaction. Par exemple, dans ce test
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class ContractServiceTest
{
…
@Autowired
private ContractService m_contractService;
@Test
public void testUpdateContract()
{
//Add the contract
m_contractService.save(m_contract);
Assert.assertNotNull(m_contract.getId());
//Update the activation date by 6 months.
final Calendar activationDate = Calendar.getInstance();
activationDate.setTime(activationDate.getTime());
activationDate.add(Calendar.MONTH, 6);
m_contract.setActivationDate(activationDate.getTime());
m_contractService.save(m_contract);
final List<Contract> foundContracts = m_contractService.findContractByOppId(m_contract.getOpportunityId());
Assert.assertEquals(foundContracts.get(0), m_contract);
} //testUpdateContract
il y a trois appels vers le service ("m_contractService.enregistrer", "m_contractService.enregistrer", et "m_contractService.findContractByOppId") et chacun est traité comme une transaction, ce qui je veux. Mais je ne sais pas comment réinitialiser ma base de données en mémoire à son état d'origine après chaque test unitaire.
Permettez-moi de savoir si j'ai besoin de fournir des informations supplémentaires.
OriginalL'auteur Dave | 2013-01-15
Vous devez vous connecter pour publier un commentaire.
Puisque vous êtes en utilisant hibernate, vous pouvez utiliser la propriété hibernate.hbm2ddl.auto pour créer la base de données sur le démarrage de tous les temps. Vous aurez aussi besoin de la force du ressort du contexte pour être rechargé après chaque test. Vous pouvez faire cela avec le @DirtiesContext annotation.
Cela peut ajouter un peu frais généraux supplémentaires pour vos tests, donc l'autre solution est de supprimer manuellement les données de chaque table.
Oui, j'ai explicitement dû mettre le classMode = ClassMode.AFTER_EACH_TEST_METHOD). La valeur par défaut est "Après la Classe", mais je voulais une nouvelle DB prêt pour parvenir à l'Unité de la méthode d'Essai.
OriginalL'auteur Solubris
@DirtiesContext n'était pas une solution pour moi, parce que l'ensemble du contexte de l'application est détruit une doivent être créés après chaque test -> Y très longtemps.
@Avant était pas non plus une bonne solution pour moi comme je l'ai créer @Avant dans chaque IntegrationTest
J'ai donc décidé de créer un TestExecutionListener qui recrée la base de données après chaque test. (Avec liquibase, mais il travaille également avec des voies de migration et normal sql)
D'utiliser le TestExecutionListenere j'ai créé un custom test (test personnalisé annotation
Dernier mais non le moins, je peux maintenant créer des tests et je peux être sûr que la base de données est en mode nettoyage.
Voulez-vous effacer vos tables de base de données ou de recréer l'ensemble du schéma sql ?
Merci!!!! J'ai besoin d'utiliser afterTestMethod au lieu de afterTestClass pour nettoyer la base de données entre chaque exécution de test
OriginalL'auteur Simon Ludwig
Vous pouvez utiliser
@Transactional
l'annotation Junit niveau de la classe deorg.springframework.transaction.annotation.Transactional
.Par exemple:
OriginalL'auteur Arun
Faire un
@Before
méthode dans laquelle vous supprimez toutes les données de la base de données. Vous êtes de l'utilisation d'Hibernate ainsi, vous pouvez utiliser les requêtes HQL:delete from Contract
.OriginalL'auteur Branislav Hašto