我在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。
我该如何测试这些服务? 提前谢谢。
答案 0 :(得分:1)
您可以使用@SpyBean
来获得所需内容。这很容易使用。
然而 - 您实际上并不需要以这种方式进行测试。因为通过测试应用程序上下文,您可以确保所有类都按照应有的方式进行注入/自动连接。然后用mocks分别在服务级别上测试方法。最后,使用@DataJpaTest
在存储库/数据库级别对其进行测试。
因此,您可以很好地解耦测试:集成测试/单元测试/存储库测试
没有必要在一个类或测试方法中将所有这三件事紧密地结合在一起。
答案 1 :(得分:1)
因此,经过所有调查后,我找到了几个解决方案。我选择使用
启用存储库和服务@SpringBootTest(classes = {ParsingService.class})
@EnableJpaRepositories(basePackages = "com.my.repository")
@EntityScan("com.my.entity")
@AutoConfigureDataJpa
这是一种解决方法。而且我认为这不是最好的。另一个解决方案是创建一个@TestConfiguration,它将返回您的服务,并且全部使用@DataJpaTest注释来启用存储库类。在这种情况下,您应该使用@SpringBootTest注释