Unit testing 服务层单元测试的另一个数据源

Unit testing 服务层单元测试的另一个数据源,unit-testing,junit,spring-data,spring-boot,Unit Testing,Junit,Spring Data,Spring Boot,在学习JUnit并体验了它对程序员和项目的好处之后,我现在想对每个实体的服务层进行单元测试,并测试每个方法是否正常工作 到目前为止,我已经为所有服务类创建了一个单元测试,但问题是数据源的数据不适合测试。因此,我必须为服务层测试创建另一个数据库,并为服务层的单元测试配置数据源。但问题是我不知道如何配置另一个数据源,只有src/test/java可以访问,并且在生产时无法访问。我还是SpringBoot和SpringData的新手,所以我想知道如何在这里配置这些需求 现在我有了这个applicati

在学习JUnit并体验了它对程序员和项目的好处之后,我现在想对每个实体的服务层进行单元测试,并测试每个方法是否正常工作

到目前为止,我已经为所有服务类创建了一个单元测试,但问题是数据源的数据不适合测试。因此,我必须为服务层测试创建另一个数据库,并为服务层的单元测试配置数据源。但问题是我不知道如何配置另一个数据源,只有
src/test/java
可以访问,并且在生产时无法访问。我还是SpringBoot和SpringData的新手,所以我想知道如何在这里配置这些需求

现在我有了这个
application.properties
配置

spring.datasource.url=<DatabaseURL>
spring.datasource.username=<DatabaseUsername>
spring.datasource.password=<DatabasePassword>
spring.datasource.driver-class-name=<DatabaseDriver>
// another datasource configuration
@Service
public class FooService {
    @PersistenceContext
    private EntityManager entityManager;

    public List<Foo> findAllByFooForm(FooForm fooForm) {
        // JPA CriteriaBuilder query accroding to FooForm
        return entityManager.createQuery(query).getResultList();
    }
}
最后,这里是服务类单元测试的示例代码

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class FooServiceTest {
    @AutoWired
    private FooService fooService

    @Test
    public void testFindAllByFooForm() {
        // Test statements
    }
}

有几种方法可以结合起来,让您能够很好地控制这一点

首先,如果您创建
src/test/resources/application.properties
,那么在测试期间,该属性仅在类路径上可用。它将覆盖您在
src/main/resources/application.properties
中定义的任何属性

如果使用内存中的数据库来支持这些测试,则可以通过使用以下属性确保加载不同的
import.sql
文件:

spring.jpa.properties.hibernate.hbm2ddl.import_files=import-test1.sql
该注释采用逗号分隔的导入脚本列表,因此可以由一个脚本加载一组基本数据,并由其他脚本加载其他(可能是特定于测试的)数据


如果您希望在每个测试中连接到不同的数据库,或导致使用不同的导入脚本,则可以使用概要文件触发此操作。如果您创建了一个属性文件
application-test1.properties
,那么测试本身可以使用注释加载该文件:
@ActiveProfiles({“test1”})

您的建议非常有效。不幸的是,Eclipse总是向我显示一个警告
资源是src/main/resources/application.properties的副本,并且没有复制到输出文件夹
。虽然这种行为看起来很正常,但是没有禁用Eclipse警告的方法,还有其他解决方法吗?我不知道。。。我不在Eclipse中进行任何构建。:)