【问题标题】:How to make Spring @Transactional to work in junit test如何使 Spring @Transactional 在 junit 测试中工作
【发布时间】:2015-12-29 21:28:01
【问题描述】:

我尝试让我的测试使用 Spring @Transactional 注释。

@ContextConfiguration(classes = SomeTest.SomeTestSpringConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest {

    @Autowired
    MyBean some;

    @Autowired
    PlatformTransactionManager transactionManager;

    @Test
    public void testSpring() throws Exception {
        some.method();
        assertTrue(some.isTransactionalWorks);
    }

    @EnableAspectJAutoProxy(proxyTargetClass = true)
    @EnableLoadTimeWeaving
    @EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
    @TransactionConfiguration
    static class SomeTestSpringConfig {

        @Bean
        PlatformTransactionManager transactionManager() {
            return new MyTransactionManager(dataSource());
        }

        @Bean
        MyBean some() {
            return new MyBean();
        }

        @Bean
        DataSource dataSource() {
            return new SimpleDriverDataSource(Driver.load(), "jdbc:h2:mem:unit-test");
        }
    }
}

class MyBean {

    @Autowired
    DataSource dataSource;

    public boolean isTransactionalWorks;

    @Transactional
    private void someInTransaction() {
        try {
            dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("I should be in transaction");
    }

    public void method() {
        someInTransaction();
    }
}


class MyTransactionManager implements PlatformTransactionManager, InitializingBean {
    private final DataSourceTransactionManager base = new DataSourceTransactionManager();

    @Autowired
    MyBean some;

    public MyTransactionManager(DataSource datasource) {
        base.setDataSource(datasource);
    }

    @Override
    public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
        some.isTransactionalWorks = true;
        return base.getTransaction(definition);
    }

    @Override
    public void commit(TransactionStatus status) throws TransactionException {
        base.commit(status);
    }

    @Override
    public void rollback(TransactionStatus status) throws TransactionException {
        base.rollback(status);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        base.afterPropertiesSet();
    }
}

我还为此测试的 VM 选项添加了 -javaagent:D:/libs/spring-instrument-4.1.7.RELEASE.jar。 但它总是失败。我错过了什么?

【问题讨论】:

  • 请检查此链接,我认为这是您面临的类似问题。 stackoverflow.com/questions/13162582/… 在此链接中,他要求在 vm 参数中同时提供 aspectjweaver.jar 和 spring-instrument.jar
  • @SanketBajoria 宾果游戏!你说的对。请添加您的评论作为答案。我会接受的。

标签: java spring junit spring-transactions spring-java-config


【解决方案1】:

请检查此链接,我认为这是您面临的类似问题。

How to configure AspectJ with Load Time Weaving without Interface

在此链接中,他要求在 vm 参数中同时提供 aspectjweaver.jar 和 spring-instrument.jar。

很高兴知道它有效。 :)

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 2012-04-04
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多