SpringBoot - Junit测试不使用JdbcTemplate为H2回滚

时间:2017-03-11 17:05:27

标签: java spring spring-boot junit4 h2

我使用Spring Initializer,嵌入式Tomcat,Thymeleaf模板引擎和包作为可执行的JAR文件生成了一个Spring Boot Web应用程序。

使用的技术:

Spring Boot 1.4.2.RELEASE,Spring 4.3.4.RELEASE,Thymeleaf 2.1.5.RELEASE,Tomcat Embed 8.5.6,Maven 3,Java 8

我有这个测试,这是失败的,因为Junit测试没有回滚插入java.lang.AssertionError: expected:<1> but was:<2>

@ContextConfiguration(classes={PersistenceConfig.class})
@RunWith(SpringRunner.class)
public class JdbcGuardianRepositoryTests {

    @Autowired
    private JdbcGuardianRepository repository;

    @Test   
    public void testGetAllGuardians() throws DataAccessException, SQLException {        
        assertEquals(1, repository.getAllGuardians(null).size());
    }


    @Test
    @Rollback
    public void testInsetGuardian() throws DataAccessException, SQLException {

        Guardian newGuardian = new Guardian();

        newGuardian.setDescription("bob desc");
        newGuardian.setEmail("bob@gmail.com");
        newGuardian.setId(Sequencer.getNextVal());
        newGuardian.setMobile("123456789");
        newGuardian.setName("bob");
        newGuardian.setSurName("bob surname");

        assertNotEquals(-1, repository.insert(newGuardian));
    }
}

1 个答案:

答案 0 :(得分:0)

@Rollback注释仅在事务管理通过Jpa / Hibernate / JdbcTemplate发生时才起作用(仅当事务由某些PlatformTransactionManager管理时,注释对事务的影响)。

看起来JdbcGuardianRepository使用普通的jdbc访问(或类似的东西),而spring对你的交易一无所知。

考虑使用JPA来管理交易,并且您将解决问题。

或者,您可以使用@Sql("/clean-db.sql")注释测试类,并在clean-db.sql内提供一些清理sql代码。 Spring将在每次测试运行之前运行此脚本。 如果这不能解决您的问题,请考虑添加有关JdbcGuardianRepository的更多信息。