当前位置: 首页 > 知识库问答 >
问题:

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

曾成天
2023-03-14

我在Spring Boot应用程序中有@Service,它正在解析文件,然后使用Spring数据JPA将其存储到DB中。我想用改变这个映射的所有逻辑来测试这个解析。为此,我需要在测试中将映射存储在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个答案

南门欣怡
2023-03-14

您可以使用@SpyBean来获得您想要的东西。它相当容易使用。

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

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

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

松烨烨
2023-03-14

所以,经过所有的调查,我找到了几个解决方案。我选择启用存储库和服务

@SpringBootTest(classes = {ParsingService.class})
@EnableJpaRepositories(basePackages = "com.my.repository")
@EntityScan("com.my.entity")
@AutoConfigureDataJpa

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

 类似资料:
  • 我是故意在谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用了模拟,而这些测试不会去任何地方。系统测试应该是对单元测试的补充,因此,模拟不是一种选择。 如果我将替换为一个test-method(让我们称之为),并引入一个顺序依赖项(使用JUnit 5非常容易),它强制在运行任何其他测试之前运行,那么这些问题就会消失。 到目前为止还好!这看起来和工作很好。当测试不是由CI服务器执行,而是由

  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • 与@mockbean和@spybean一样,有没有类似于@fakebean/@dummybean的东西? 其思想是,该实例是100%真实的(具有预期的生产内部状态),并且它覆盖(或者添加bean,以防在配置中没有声明)上下文中的bean。理想情况下,您不需要创建TestConfiguration类并将其设置为Primary,因为这样可以在每个测试的基础上控制假冒,只有在需要时才可以。否则它使用主的

  • 问题内容: 我正在GoLang中为一个简单的REST服务编写测试。但是,因为我使用julienschmidt / httprouter 作为路由库。我正在努力编写测试。 main.go 控制器 我的问题是:当GetBook既不是HttpHandler也不是HttpHandle时如何测试呢? 如果我使用传统的处理程序,这样的测试将很容易 问题是,httprouter不是处理程序,也不是handlef

  • 我是新的弹簧靴,做了我的第一个实体。如何测试存储库?我使用的是本地MySQL数据库。那么第一步就是嘲弄数据库? 而我的存储库只是扩展了Jparepository。 我得到的错误是java.lang.IllegalStateException:未能加载ApplicationContext。还有一点:无法用嵌入式数据库替换DataSource进行测试。如果您想要一个嵌入式数据库,请在类路径上放置一个受

  • 我现在开始学习Java和Spring Boot,并且在集成测试中遇到了一些依赖注入问题。我在src/main/java/com/rfd/domain/service下有一个名为TransactionService的类,它被标记为@Service,它有另一个依赖项,其中一个是Spring Boot创建的存储库。当我启动应用程序时,它会正确启动,因此我假设依赖项正在正确解析。这是总结的类: 现在,我在