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

时间:2015-01-08 05:02:29

标签: unit-testing junit spring-data spring-boot

在学习了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

这是服务类的示例代码。它使用application.properities - dataSource配置。

@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
    }
}

1 个答案:

答案 0 :(得分:1)

有一些方法可以结合起来,让你很好地控制它。

首先,如果您创建src/test/resources/application.properties,那么只有在测试期间才能在类路径上使用它。它将覆盖您在src/main/resouces/application.properties中定义的所有属性。

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

spring.jpa.properties.hibernate.hbm2ddl.import_files=import-test1.sql

该注释采用以逗号分隔的导入脚本列表,因此您可以使用一个脚本加载的基本数据集以及其他脚本加载的其他(特定于测试的)数据。

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