【问题标题】:@Transactional does not rollback in JUnit test@Transactional 在 JUnit 测试中不回滚
【发布时间】:2017-03-13 00:07:06
【问题描述】:

我在同一个测试类中有 2 个 JUnit 测试,每个测试都标记为 @Transactional,第一个创建用户,第二个创建用户并检查我们是否可以获得这些用户。

问题是当第二个测试运行时,第一个测试创建的用户还在数据库中。

@Test
@Transactional
public void testCreateUser() throws Exception

@Test
@Transactional
public void testGetUserById() throws Exception

你知道为什么@Transactional 在同一个测试类中不能正常工作吗?此外,数据在测试类结束时回滚。

我正在使用 Spring boot + Mysql + Hibernate。

感谢您的宝贵时间。

【问题讨论】:

  • 你是在执行单元测试还是集成测试?
  • 你定义了一个 transactionManager() ? :stackoverflow.com/a/35943700/641627
  • 我尝试这样做,但我遇到了一些错误,例如 Could not open ServletContext resource [/application.properties] @Transactional 是为此目的而制作的,为什么它不起作用?

标签: java mysql spring hibernate junit


【解决方案1】:

添加到配置类@EnableTransactionManagement

【讨论】:

    【解决方案2】:

    尝试这样的事情并注意...context.xml 的类路径。 如果您希望每个方法都是事务性的,也可以将 @Transactional 移到类之上,或者移到您想要的每个方法之上。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({"classpath:/config/your-context.xml","classpath:/config/ehcache.xml"})
    @Transactional
    @WebAppConfiguration
    public class IntegrationTests {
    
    @Autowired
    private ApplicationContext appContext;
    
    @Autowired
    public FileDao fileDao;
    
    @Autowired
    public SessionFactory sessionFactory;
    
    @Test
    public void test1() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException{
        ....
        ....
        ....
        }
    }
    

    【讨论】:

    • 也许它适用于 Spring MVC,我尝试使用 application.properties 作为 ContextConfiguration 但它不起作用
    • 你用的是Spring boot,我没看到,不好意思。这适用于 Spring MVC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2016-03-04
    相关资源
    最近更新 更多