如何使用Spring Boot编写集成/系统测试以使用存储库测试服务

时间:2018-06-14 09:56:18

标签: java spring spring-boot integration-testing

我在Spring Boot应用程序中有@Service,它解析文件,然后使用Spring Data JPA将其存储到数据库中。我想用更改此映射的所有逻辑来测试此解析。因此,为此,我需要在测试中将数据存储在DB中。

@Service  
public class ParsingService {
    @Autowired
    private StoringInDBRepository storingInDBRepository;
}

@Repository
public interface StoringInDBRepository extends JpaRepository<MyEntity, String> {

问题是在使用注释@SpringBootTest的测试期间,我不想加载整个上下文,而只加载我的ParsingService。 当我写作:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ParsingService.class})
public class ParsingServiceTest{

    @Test
    public void someTest(){
    }
}

无法初始化此测试,因为我没有在@SpringBootTest注释中加载StoringInDBRepository。但是我可以这样做,因为StoringInDBRepository是一个接口。只有在我测试存储库层时,根据javadoc使用@DataJpaTest才是正确的。建议不要使用@DataJpaTest和@SpringBootTest。

我该如何测试这些服务? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用@SpyBean来获得所需内容。这很容易使用。

然而 - 您实际上并不需要以这种方式进行测试。因为通过测试应用程序上下文,您可以确保所有类都按照应有的方式进行注入/自动连接。然后用mocks分别在服务级别上测试方法。最后,使用@DataJpaTest在存储库/数据库级别对其进行测试。

因此,您可以很好地解耦测试:集成测试/单元测试/存储库测试

没有必要在一个类或测试方法中将所有这三件事紧密地结合在一起。

答案 1 :(得分:1)

因此,经过所有调查后,我找到了几个解决方案。我选择使用

启用存储库和服务
@SpringBootTest(classes = {ParsingService.class})
@EnableJpaRepositories(basePackages = "com.my.repository")
@EntityScan("com.my.entity")
@AutoConfigureDataJpa

这是一种解决方法。而且我认为这不是最好的。另一个解决方案是创建一个@TestConfiguration,它将返回您的服务,并且全部使用@DataJpaTest注释来启用存储库类。在这种情况下,您应该使用@SpringBootTest注释