java - 使用 TestNG 测试数据库不回滚

标签 java mysql spring testng spring-test

我正在尝试使用 DB 和 TestNG 进行一些基本的自动化测试,但它不起作用。第一次运行如我所料成功,第二次没有成功,因为第一次从未回滚。我看了几个地方的例子,似乎是正确的。谁知道我缺少什么

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
        <scope>test</scope>
    </dependency>

代码:

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.Test;

@ContextConfiguration(classes = AutomatedTest.Context.class)
public class RollbackTest extends AbstractTransactionalTestNGSpringContextTests {


  @Test
  @Rollback
  @Transactional
  public void testThing() throws Exception {

    Class<? extends RollbackTest> c = this.getClass();
    String path = String.format("/%s.sql", c.getName().replaceAll("\\.", "/"));
    super.executeSqlScript(path, false);
  }

  @Configuration
  @PropertySource("db.properties")
  static class Context {

    @Bean
    public DataSource dataSource(
        @Value("${datasource.url}") String url,
        @Value("${datasource.username}") String user,
        @Value("${datasource.password}") String pass,
        @Value("${datasource.driver-class-name}") String driver) throws PropertyVetoException {
      ComboPooledDataSource ds = new ComboPooledDataSource();
      ds.setUser(user);
      ds.setPassword(pass);
      ds.setJdbcUrl(url);
      ds.setDriverClass(driver);
      return ds;
    }

    @Bean
    public Connection connection(DataSource dataSource) throws SQLException {
      Connection c = dataSource.getConnection();
      System.out.println("Connection is " + c);
      return c;
    }

    @Bean
    public DataSourceTransactionManager txMan(DataSource ds) {
      return new DataSourceTransactionManager(ds);
    }
  }
}

sql:

CREATE SCHEMA FOO;

CREATE TABLE FOO.BAZ (
  ID int PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(256) NOT NULL
);

INSERT INTO FOO.BAZ (name) values('christian');

错误:

创建架构 FOO

org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [automated/RollbackTest.sql]: CREATE SCHEMA FOO; nested exception is java.sql.SQLException: Can't create database 'FOO'; database exists

最佳答案

返回Connection@Bean方法看起来非常可疑。所以我建议您删除它。

要在测试方法之前之后执行 SQL 脚本,最好查看 Spring 的 @Sql 注释。

此外,您还可以安全地删除测试方法中的 @Rollback@Transactional 声明。

  • @Rollback 是默认行为。
  • @Transactional 已在 AbstractTransactionalTestNGSpringContextTests 上声明。

问候,

Sam(Spring TestContext 框架的作者)

关于java - 使用 TestNG 测试数据库不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47022287/

相关文章:

mysql - 有没有办法简化这个查询?

java - 解决 Thymeleaf 缺乏可选支持的问题

java - 为什么在Spring中使用服务实现模式

java - 即使我不点击按钮触摸监听器也会响应

java - While 循环 While 字符串不等于多个其他字符串 (Java)

java - 如何使用 Java 10 及更高版本跳过 ant 中的 javah 任务?

php - 从数据库问题查询嵌套关联数组

java - 在 HTTP Preview 上运行 Web 项目时出现错误 : "Could not find JRE executable" on MAC OS X Yosemite

java - Sqlexception 在 Mysql Workbench 上工作时对空结果集进行非法操作

mysql - Tomcat 在每次启动时创建新的数据库 session + mysql