1

Spring 3.1 MVC +Hibernate3.6プロジェクトとそのjunit4テストスーツがあります。私の問題は、@ Transactionalを追加したにもかかわらず、テストケースでトランザクションが開始されないことです

私のテストケースはコントローラーとdaoを呼び出します。コントローラでは、とにかくトランザクションが開始されるので、文句はありません。daoでは、@ Transactional(propagation = Propagation.MANDATORY)を追加して、テストのトランザクションが確実に行われるようにしました。そして現在、IllegalTransactionStateExceptionが発生します。これは、現在のトランザクションがないことを意味していると思います。

プログラムでトランザクションを作成しようとしましたが、機能します。つまり、daoサービスを取得するためのAOPプロキシが問題の原因ではありません。ただし、 @ Transactionalアノテーションを使用してトランザクションを作成したいと思います。

これが私のダオです:

// ...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;
        }
    }
    ...
}

これが私のテストケースです:

// ...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. 

    }

}

Springのすべてのドキュメントを検索し、想像できる方法でグーグルで検索しましたが、トランザクションが開始されない理由がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

13

使用するときは、独自のコンテキストからではなく、@RunWith(SpringJUnit4ClassRunner.class)によって作成されたアプリケーションコンテキストからBeanを取得する必要があります。SpringJUnit4ClassRunner

あなたの場合@Transactional、単体テストでによって管理されるアプリケーションコンテキストでトランザクションが作成されるため、問題SpringJUnit4ClassRunnerが発生しますが、手動で作成されたアプリケーションコンテキストから取得したBeanでメソッドを呼び出します。

したがって、@BeforeClassメソッドを削除して、自動配線をTaskDao介して取得します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/test-config.xml", "/applicationContext.xml" })  
@TransactionConfiguration(defaultRollback = true)
@Transactional  
public class TestTaskController {
    @Autowired
    private TaskDao taskDao; 

    ...
}

参照:

于 2012-07-15T13:44:38.180 に答える