Pourquoi ne pas le démarrage de transaction dans mon cas de test junit?
J'ai un Printemps 3.1 MVC + Hibernate 3.6 projet avec ses junit4 test du costume. Mon problème est que il n'y a pas de transaction de départ dans mon cas de test, même si j'ai ajouté un @Transactional.
Mon cas de test d'appels d'un contrôleur et d'un dao. Dans le contrôleur, une transaction est lancée de toute façon, donc on ne se plaint pas. Dans le dao, j'ai ajouté un @Transactional(propagation = Propagation.OBLIGATOIRE) pour être sûr qu'il va passer le test de la transaction. Et actuellement, il soulève une IllegalTransactionStateException, qui, j'imagine, il n'y a pas de transaction en cours.
J'ai essayé de créer programmaticaly une transaction et qu'il fonctionne, ce qui signifie que l'AOP proxy pour la dao service n'est pas la cause du problème. Cependant je veux créer une transaction avec le @Transactional annotation.
voici mon dao:
//...imports...
@Repository("taskDao")
@Transactional(propagation = Propagation.MANDATORY)
public class TaskHome implements TaskDao {
private static final Log log = LogFactory.getLog(TaskHome.class);
private SessionFactory sessionFactory;
@Autowired
public TaskHome(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Task findById(int id) {
log.debug("getting Task instance with id: " + id);
try {
Task instance = (Task) this.sessionFactory.getCurrentSession().get(
Task.class, id); //exception raised here!
if (instance == null) {
log.debug("get successful, no instance found");
} else {
log.debug("get successful, instance found");
}
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
...
}
Voici mon cas de test:
//...imports...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/test-config.xml", "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class TestTaskController {
private static ClassPathXmlApplicationContext context;
private static TaskDao taskDao;
@BeforeClass
public static void initHibernate() throws Exception {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
taskDao = context.getBean("taskDao", TaskDao.class);
}
@Test
public void testOnSubmit() {
//expects an existing default transaction here
Task task = taskDao.findById(1); //fails already here
//... calls the controller and does some tests.
}
}
J'ai cherché dans tous les Printemps de la documentation et googlé de toute façon je ne pouvais l'imaginer, mais je ne vois pas pourquoi l'opération n'est pas démarré.
Toute aide est la bienvenue.
- ce qui se passe lorsque vous retirez (propagation = Propagation.OBLIGATOIRE)?
- il crée une nouvelle transaction, ce qui permettra d'éviter la restauration.
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de
@RunWith(SpringJUnit4ClassRunner.class)
vous devriez obtenir des grains de l'application de contexte créé parSpringJUnit4ClassRunner
plutôt que de la vôtre.Dans votre cas, les choses vont mal parce que
@Transactional
sur l'unité de test crée une transaction dans le contexte de l'application gérée parSpringJUnit4ClassRunner
, mais vous appeler des méthodes sur les grains obtenus à partir du contexte de l'application créée manuellement.Retirez votre
@BeforeClass
méthode et obtenirTaskDao
via permettra à l'autowiring:Voir aussi: