web-dev-qa-db-fra.com

Comment réinitialiser mon état de base de données après chaque test de l'unité sans effectuer l'ensemble du test une transaction?

J'utilise le printemps 3.1.1.Release, hibernate 4.1.0.Finale, JPA 2, JUNIT 4.8.1 et HSQL 2.2.7. Je veux exécuter des tests Junit sur mes méthodes de service et, après chaque test, j'aimerais que toutes les données écrites dans la base de données en mémoire soient rétablies. Cependant, je ne veux pas que l'ensemble du test soit traité 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 au service, ("m_contracttservice.save", "m_contracttservice.save" et "m_contracttservice.findcontractebyoppid") et chacun est traité comme une transaction que 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 de l'unité.

Faites-moi savoir si je dois fournir des informations supplémentaires.

24
Dave

Depuis que vous utilisez Hibernate, vous pouvez utiliser la propriété hibernate.hbm2ddl.auto pour créer la base de données au démarrage à chaque fois. Vous auriez également besoin de forcer le contexte de printemps à être rechargé après chaque test. Vous pouvez le faire avec l'annotation @dirtiesContext.

Cela pourrait ajouter un bit de surcharge supplémentaire à vos tests, de sorte que l'autre solution consiste à supprimer manuellement les données de chaque table.

20
Solubris

Vous pouvez utiliser @Transactional Annotation au niveau de la classe Junit de org.springframework.transaction.annotation.Transactional.

Par exemple:

package org.test
import org.springframework.transaction.annotation.Transactional;

@Transactional
public class ArmyTest{

}
2
Arun

Je résolvez le même problème à l'aide d'une base de données de mémoire aléatoire pour chaque test:

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@TestPropertySource(properties = {
    "spring.datasource.url=jdbc:hsqldb:mem:${random.uuid}"
})
0
TangZero

Faire un @Before Méthode dans laquelle vous supprimez toutes les données de la base de données. Vous utilisez Hibernate afin que vous puissiez utiliser HQL: delete from Contract.

0
user1137032