【发布时间】:2018-10-11 20:04:30
【问题描述】:
我正在尝试使用以下方法设置一些 Spring Boot JPA 测试:
package biz.ianw.coindatabase.test;
@RunWith(SpringRunner.class)
@DataJpaTest
public class DbTests {
@Test
public void test1() { ... }
}
我有一个服务类:
package biz.ianw.coindatabase.database;
//@Service
@Repository
@Transactional(readOnly=false)
public class CoinDbService { ... }
和一个应用程序:
package biz.ianw.coindatabase;
@SpringBootApplication
@Slf4j
@Configuration
@EnableEncryptableProperties
public class Main {
@Autowired
CoinDbService dbService;
... }
开始测试会报错:
biz.ianw.coindatabase.Main 中的字段 dbService 需要一个“biz.ianw.coindatabase.database.CoinDbService”类型的 bean,但无法找到。
我认为这与启动期间 @DataJpaTest 加载的 bean 类型有关:
如果您想测试 JPA 应用程序,可以使用@DataJpaTest。经过 默认它会配置一个内存嵌入式数据库,扫描 @Entity 类并配置 Spring Data JPA 存储库。常规的 @Component beans 不会被加载到 ApplicationContext 中。
我不太清楚为什么 @Service 类应该被视为 JPA 测试不需要,但我试图通过将其注释为 @Repository 来强制解决问题,但无济于事。
我可以使用@Import(...) 手动加载该类,但这似乎有点棘手。有没有更好的方法告诉 DataJpaTest 我需要测试什么?
【问题讨论】:
-
@DataJpaTest的目标是测试 JPA 自动配置、实体的映射以及您正在使用的任何 Spring Data Repositories。服务不在此范围内。如果你想要一个服务的集成测试,你需要@SpringBootTest -
SpringBootTest 结束了整个基础设施,包括 MVC,这不是我想要的数据库测试。如果默认情况下我可以使用 DataJpaTest 测试的只是存储库,那么我正在测试 jpa,而不是我自己的代码。
-
并非如此,您正在测试您的代码如何与 JPA 交互。您还在测试您在 spring 数据存储库中定义的任何查询方法是否执行您希望它执行的操作。您的
@Service类(应该)处于比这更高的抽象级别,因此 Spring 不将它们视为@DataJpaTest范围的一部分。要自动装配您的服务,您需要完整的容器。您可能可以创建一个不加载 MVC 环境的替代应用程序类并将其用作测试的配置
标签: unit-testing spring-boot spring-data-jpa