服务层单元测试的另一个数据源
Another datasource for service layer unit testing
在学习了 JUnit 并体验了它对程序员和项目的好处之后,我现在想对每个实体的服务层进行单元测试,并测试每个方法是否正常工作。
截至目前,我已经为我的所有服务 classes 创建了一个单元测试,但问题是数据源的数据不适合测试。因此,我必须为服务层测试创建另一个数据库,并为服务层的单元测试配置数据源。但问题是我不知道如何配置另一个数据源,只有 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
这里是服务的示例代码 class。它使用 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();
}
}
最后,这是一个服务单元测试的示例代码class。
@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/resouces/application.properties
.
中定义的任何属性
如果您使用内存数据库来支持这些测试,那么您可以确保加载不同的 import.sql
文件,通过使用以下 属性:
spring.jpa.properties.hibernate.hbm2ddl.import_files=import-test1.sql
该注释采用逗号分隔的导入脚本列表,因此您可以让一个脚本加载一组基本数据,并让其他脚本加载额外的(可能是特定于测试的)数据。
如果您希望在每个测试中连接到不同的数据库,或者导致使用不同的导入脚本,那么您可以使用配置文件来触发它。如果您创建一个属性文件 application-test1.properties
,那么测试本身可以使用注释加载该文件:@ActiveProfiles({"test1"})
.
在学习了 JUnit 并体验了它对程序员和项目的好处之后,我现在想对每个实体的服务层进行单元测试,并测试每个方法是否正常工作。
截至目前,我已经为我的所有服务 classes 创建了一个单元测试,但问题是数据源的数据不适合测试。因此,我必须为服务层测试创建另一个数据库,并为服务层的单元测试配置数据源。但问题是我不知道如何配置另一个数据源,只有 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
这里是服务的示例代码 class。它使用 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();
}
}
最后,这是一个服务单元测试的示例代码class。
@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/resouces/application.properties
.
如果您使用内存数据库来支持这些测试,那么您可以确保加载不同的 import.sql
文件,通过使用以下 属性:
spring.jpa.properties.hibernate.hbm2ddl.import_files=import-test1.sql
该注释采用逗号分隔的导入脚本列表,因此您可以让一个脚本加载一组基本数据,并让其他脚本加载额外的(可能是特定于测试的)数据。
如果您希望在每个测试中连接到不同的数据库,或者导致使用不同的导入脚本,那么您可以使用配置文件来触发它。如果您创建一个属性文件 application-test1.properties
,那么测试本身可以使用注释加载该文件:@ActiveProfiles({"test1"})
.