用于 Spring junit测试的mysql

标签 mysql spring junit h2

有什么方法可以使用 MySQL 进行 Spring 的 JUnit 测试吗?

我问这个是因为我在 MYSQL 中有很多存储过程并且我注意到 H2 不能与 SP 一起工作。

编辑:

现在我对 src/main 的配置如下:

@ComponentScan
@EnableAutoConfiguration
@EnableJpaRepositories
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext =  SpringApplication.run(Application.class, args);
    }
}


spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=user
spring.datasource.password=pw
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Spring 可以很好地处理这种配置。它读取 application.properties,查看 spring.datasource.* 并知道我已经设置了数据源。

这里一切都很好。

现在,在测试中我使用类似的东西:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class})
@Transactional
public class TxServiceTest {

}

这不会针对 MySQL 数据库运行测试。它将使用 H2 数据库运行测试。我需要使用 MySQL 进行测试,因为我使用了很多存储过程。

我尝试过许多其他组合,但没有一个有效。我在这里缺少什么?

可能的修复:

我不知何故找到了一种让它工作的方法。我让主项目保持不变,并在我的测试项目中添加了一个新类:

@Configuration
public class PersistenceContext {

    @Bean
    public DataSource dataSource() {
        org.apache.tomcat.jdbc.pool.DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost/mydb?noAccessToProcedureBodies=true");
        dataSource.setUsername("xx");
        dataSource.setPassword("yy");
        return dataSource;
    }

}

我不太喜欢这个解决方案,但它确实有效。

最佳答案

听起来像是集成测试。首先,确保您的数据库始终是最新的,以避免恢复和处理常见错误。您可以使用 liquibase 或 flyway 来管理增量。另外,确保在执行测试后数据库的状态没有被改变。我的意思是,如果一开始你有一个没有数据的表,那么在你执行测试之后这个表一定没有数据。您可以使用 dbunit 或 spring-dbunit,它是 dbunit for spring 的扩展来管理它。

为了使用本地 mysql 数据库,您可以使用此插件 http://mysql.jcabi.com/

编辑 01

替换您的 h2 数据源 bean:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/demo" />
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>

关于用于 Spring junit测试的mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28841994/

相关文章:

PHP JSON_ENCODE 无法显示超过 1000 个 MySQL 表字段

java - Android向数据库添加空白行

php - 我可以使用什么 Sql Join 来组合我的三个表

PHP登录并连接到MySql

Spring MVC 3 - 将 'immutable' 对象绑定(bind)到表单

java - spring jpa onetomany 连接表审计

java - Spring MVC @Controller 拦截自己的请求

unit-testing - 模拟 getResourceAsStream() 方法

java - 断言 Set 包含具有返回给定值的方法的对象

java - 需要访问存储库的测试方法