使 Spring JUnit Test 在测试数据库上运行

Posted

技术标签:

【中文标题】使 Spring JUnit Test 在测试数据库上运行【英文标题】:Make Spring JUnit Test run on test database 【发布时间】:2017-09-08 08:14:36 【问题描述】:

我想将我的 JUnit 测试配置为在与运行应用程序的数据库不同的数据库上运行。我已经这样做了几个小时,但到目前为止还没有成功。尝试使用 application.properties 文件和 spring 配置文件对其进行配置,但没有任何效果。那么如何实现呢?任何帮助将不胜感激。

这是我的测试文件:

@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
public class TestContactController extends AbstractTest 

    @Autowired
    private MockMvc mvc;

    @Test
    @Rollback
    public void testAddContact() throws Exception 
        mvc.perform(MockMvcRequestBuilders.get("/contact/add").contentType(MediaType.APPLICATION_JSON)
            .content("\n" +
                    "\t\"authCode\": \"daca824a0bf04d038543373adfdb2c8f\",\n" +
                    "\t\"requestData\":\n" +
                    "\t\t\"firstName\": \"Max\",\n" +
                    "\t\t\"lastName\": \"Mustermann\",\n" +
                    "\t\t\"category\": \n" +
                    "\t\t\t\"id\": " + categoryId + "\n" +
                    "\t\t, \"partOfOrgUnit\": \n" +
                    "\t\t\t\"id\": " + companyId + "\n" +
                    "\t\t\n" +
                    "\t\n" +
                    ""))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("\"success\":true,\"message\":\"SUCCESS: Contact added successfully\"")));
    

我的持久化 xml,有两个数据库:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">
    <persistence-unit name="sab_pu">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3307/projectdb?serverTimezone=UTC"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="javax.persistence.validation.mode" value="NONE"/>
        </properties>
    </persistence-unit>
    <persistence-unit name="sab_test_pu">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3307/testdb?serverTimezone=UTC"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="javax.persistence.validation.mode" value="NONE"/>
        </properties>
    </persistence-unit>
</persistence>

这是我的 .properties 文件:

spring.datasource.url=jdbc:mysql://localhost:3307/testdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

例外:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.SAB.test.testsController.TestContactController':
Unsatisfied dependency expressed through field 'mvc'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean which qualifies as autowire candidate. 
Dependency annotations:@org.springframework.beans.factory.annotation.Autowired(required=true)

【问题讨论】:

***.com/a/34756569/3641067 如上所述,我试过了,但它只是忽略了 .properties 文件中的设置 嗯,我不太确定。我对此有点陌生,我想使用 MocMvc 来执行我的休息请求。通过删除 @AutoConfigure 它不再起作用。我应该自己配置而不是让 spring 为我做吗? 好的,那我该如何配置呢? 【参考方案1】:

你有可能使用 Spring Boot 吗?它也为您提供了一个“简单的”基于 Servlet 的部署到已经存在的 Tomcat 实例中。我最后一次普通的春季课程太遥远了。

我可以给你一个 Nikos 回答 Spring Boot 的例子,并假设你正在使用 Maven。

在 Spring Boot 中,可以使用 application.properties 文件配置大多数内容。这也包括persistence.xml 文件的设置。

为了您的生产环境,在src &gt; main &gt; resources 中创建一个application.properties 文件,内容如下。

spring.datasource.url=jdbc:mysql://localhost:3307/projectdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto: create-drop
spring.jpa.show-sql=true

测试环境需要一个名为application-test.properties的文件,里面有这个内容。

spring.datasource.url=jdbc:mysql://localhost:3307/testdb?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

如您所见,对于testing,您无需重复所有内容,只需重复更改的内容即可。

现在您可以通过启动应用程序来测试您的应用程序以生产模式运行。在您的控制台中,您应该看到 Spring Boot 使用 MySQL。如果你想使用你的测试设置添加-Dspring.profiles.active=test作为JVM参数。

完成这些步骤后,让我们切换到如下所示的 JUnit 测试。

@RunWith(SpringRunner.class)
@SpringBootTest(properties = "spring.profiles.active=test")
@AutoConfigureMockMvc
public class MeTest 
    @Test
    public void testMe() 
        System.out.println("Hello World!");
    

@SpringBootTest 将当前配置文件设置为 test 并启动 JUnit 测试运行。

这只是解决您的问题的一种可能方法。我希望它对您有所帮助,并且一切正常,因为我的工作机器上没有 MySQL 数据库。

【讨论】:

我正在使用 Spring Boot 并按照您的建议进行操作,但是在删除“@AutoConfigureMockMvc”注释后,我得到以下异常(请参阅已编辑的问题)。我应该如何配置 mockmvc? 在JUnit测试中添加@AutoConfigureMockMvc是否有效?我更新了我的示例。 不,如果我补充说它不再在测试数据库上运行 我实现了一个快速而肮脏的例子,我使用 H2 数据库进行测试。在这个示例中,我可以使用 Spring Data 存储实体并使用 MockMvc 调用 REST 服务,您是否使用我的 application.properties 示例来配置数据库? 好的,我设法根据我的控制器配置了 mockmvc,它工作正常。非常感谢!

以上是关于使 Spring JUnit Test 在测试数据库上运行的主要内容,如果未能解决你的问题,请参考以下文章

spring boot进行Test测试

Spring Test+JUnit整合使用

Spring-test + Junit4单元测试

聊聊单元测试——Spring Test+JUnit完美组合

聊聊单元测试——Spring Test+JUnit完美组合

spring框架学习spring与junit整合测试