2009-11-10 6 views
0

Bonjour les bonnes personnes que je suis venu à travers un comportement étrange dans mon test. J'utilise JPA hibernate annotation avec spring. Disons que j'ai un MyObject classe et il est email de propriété est ensemble marquéBase de données n'est pas tombé entre les tests unitaires

@Column(name="EMAIL", length=100, unique=true) 
private String email; 

je me prépare pour ce que je dois être dans la base de données dans la configuration de cette classe MyObjectDAOImplTest

@Autowired 
MyObject1 ob1; 
@Autowired 
MyObject1 ob2; 

@Before 
public void setUP(){ 
    dao = manager.createthedao(); 

    .... 
    ob1.setEmail("[email protected]"); 
    .... 

    .... 
    ob2.setEmail("[email protected]"); 
    .... 
    dao.save(ob1); 
    dao.save(ob2); 

} 

donc ma partie à partir de la méthode de test du poing, tout le reste est en train de guérir. Je parle des valeurs en double dans la colonne email mais mon hbm2ddl.auto = create et j'ai même utilisé le create-drop. mais reste. Je ne comprends pas. J'ai utilisé ceci dans tellement de projet sans l'unique bien sûr mais je m'attends à ce que la base de données soit abandonnée chaque fois qu'une méthode d'essai est exécutée. Y at-il quelque chose au sujet de l'unique que je devrais être au courant de? Merci de m'avoir lu. Donnez-moi votre suggestion. Est-ce que j'ai oublié quelque chose ou omis de le faire?

Répondre

1

Il vous manque @After method ce qui explique pourquoi vous voyez ce comportement. Lors de l'exécution de tests jUnit 4.x, toute la suite est exécutée dans un seul thread l'un après l'autre, ce qui signifie que vous devez effacer l'état vous-même ou un comportement non spécifié, généralement les ressources restent suspendues et provoquent des effets secondaires.

+0

mmmh ne savait pas que c'est le cas.je l'ai finalement fait, mais dans mon esprit, c'était je travaille autour parce que je pensais que je ne suis pas censé le faire –

1

Ne devriez-vous pas avoir du code pour supprimer/supprimer la base de données de tests unitaires après (ou de préférence avant) chaque test? Êtes-vous sûr de créer la base de données? Quel moteur de base de données utilisez-vous?

Si vous utilisez une base de données basée sur la mémoire, l'initialisez-vous au bon endroit (chaque fois qu'un test est exécuté)?

Appellez-vous quelque part SessionFactory.close()? Si vous utilisez hibernate.hbm2ddl.auto=create-drop, cela devrait gérer l'abandon de la base de données.

+0

merci pour la réponse, voici ma hsql.jdbc.properties jdbc.driverClassName = org.hsqldb.jdbcDriver jdbc.username = sa jdbc.password = jdbc.url = jdbc: hsqldb file: mydb; créer = true J'ai basculé vers mysql à cause de ce problème. quand j'ai testé avec hbm2ddl.auto = create-drop et puis j'ai commenté toute ma méthode de test mais le premier.et j'ai vu le db tomber après avoir rafraîchi le db navigateur. –

+0

Veuillez ajouter tous les fichiers de configuration pertinents à votre question. –

+0

btw. vous devriez peut-être envisager d'utiliser le mode en mémoire pour les tests. (jdbc.url = jdbc: hsqldb: mem: mydb; create = true) ... ça devrait être plus rapide. – varad

Questions connexes