java - 为什么 BeforeTransaction 和 AfterTransaction 方法没有触发?

标签 java spring junit spring-jdbc

我有一些使用 JUnit 和 Spring 来测试简单 DAO 的单元测试。

我的理解是,当我将一个类标记为@Transactional时,@BeforeTransaction和@AfterTransaction方法应该在我的@Test方法之前和之后运行。然而,这些方法根本没有被解雇。我没有看到 before 和 after 方法的任何输出,如果我添加断点,它们就不会被命中。

知道我在这里做错了什么吗?

@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource("/app.properties")
@Transactional
@ContextConfiguration(classes={TestDataSourceConfiguration.class, GeneralConfiguration.class}, loader=AnnotationConfigContextLoader.class)
public class TestBreadDAO {

    @Autowired
    private BreadDAO breadDAO;

    @BeforeTransaction
    public void beforeTransaction() {
        System.out.println("Hello from beforeTransaction!");
    }

    @Test
    public void testRetrieve() throws SQLException {
        System.out.println("Hello from testRetrieve!");
        Bread bread = breadDAO.retrieveBreadById("1");
        Assert.assertTrue(bread != null);
        Assert.assertTrue(bread.getBreadId().equals("1"));
        Assert.assertTrue(bread.getSesameSeeds() == 41000);
        Assert.assertTrue(bread.getOats() == 100000);
    }

    @Test
    public void testInsert() throws SQLException {
        System.out.println("Hello from testInsert!");
        Bread bread = new Bread();
        bread.setBreadId("20");
        bread.setSesameSeeds(15000);
        bread.setOats(30000);
        breadDAO.insertBread(Bread);
        Bread bread2 = breadDAO.retrieveBreadById("20");
        Assert.assertTrue(bread.getBreadId().equals(bread2.getBreadId()));
        Assert.assertTrue(bread.getSesameSeeds() == bread2.getSesameSeeds());
        Assert.assertTrue(bread.getOats() == bread2.getOats());
    }

    @AfterTransaction
    public void afterTransaction() {
        System.out.println("Hello from afterTransaction!");
        Bread bread = breadDAO.retrieveBreadById("20");
        Assert.assertTrue(bread == null);
    }
}

输出:

Hello from testInsert! 
Hello from testRetrieve!

编辑:通过将此 bean 添加到我的配置中来修复此问题。

@Bean
public PlatformTransactionManager dataSourceTransactionManager() {
    DataSourceTransactionManager txMgr = new DataSourceTransactionManager();
    txMgr.setDataSource(dataSource);
    return txMgr;
}

最佳答案

To enable support for transactions, however, you must configure a PlatformTransactionManager bean in the ApplicationContext

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html

关于java - 为什么 BeforeTransaction 和 AfterTransaction 方法没有触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30790079/

相关文章:

Java 用括号替换全部

JavaFX:绘制无限符号并向前移动

java - 我们如何知道 Spring Boot 应用程序是否正在使用连接池

java - Spring AOP 中的 Advise 方法错误

java - JUnit - 从 Web 应用程序运行测试用例

java - 如果部分测试花费的时间太长,如何从 JUnit 测试返回到 main 方法

java - 单元测试私有(private)字段

java - CAVAJ java反编译器查看所有被CodeGuard混淆的代码

java - Spring WebFlux 消费者接收器

java - struts2 spring框架的命令行界面(maven编译)