mysql在春天进行junit测试

时间:2015-03-03 21:13:00

标签: mysql spring junit h2

有没有办法使用MySQL进行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;
    }

}

我不太喜欢这个解决方案,但它正在发挥作用。

1 个答案:

答案 0 :(得分:1)

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

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

编辑01

替换你的h2 dataSource 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>