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

单元测试中的Spring启动数据源

程枫
2023-03-14

我有一个简单的Spring启动Web应用程序,它从数据库中读取并返回JSON响应。我有以下测试配置:

@RunWith(SpringRunner.class)
@SpringBootTest(classes=MyApplication.class, properties={"spring.config.name=myapp"})
@AutoConfigureMockMvc
public class ControllerTests {
    @Autowired
    private MockMvc mvc;
    @MockBean
    private ProductRepository productRepo;
    @MockBean
    private MonitorRepository monitorRepo;

    @Before
    public void setupMock() {
        Mockito.when(productRepo.findProducts(anyString(), anyString()))
        .thenReturn(Arrays.asList(dummyProduct()));     
    }

    @Test
    public void expectBadRequestWhenNoParamters() throws Exception {    
        mvc.perform(get("/products"))
                .andExpect(status().is(400))
                .andExpect(jsonPath("$.advice.status", is("ERROR")));
    }

    //other tests
}

我有一个数据源 Bean,它是在应用程序的主配置中配置的。当我运行测试时,Spring 尝试加载上下文并失败,因为数据源取自 JNDI。一般来说,我想避免为此测试创建数据源,因为我有模拟的存储库。

是否可以在运行单元测试时跳过数据源的创建?

在内存中测试数据库不是一个选项,因为我的数据库创建脚本具有特定的结构,并且无法从classpath:schema轻松执行.sql

编辑 数据源在“我的应用程序”中定义.class

    @Bean
    DataSource dataSource(DatabaseProeprties databaseProps) throws NamingException {
       DataSource dataSource = null;
       JndiTemplate jndi = new JndiTemplate();
       setJndiEnvironment(databaseProps, jndi);
       try {
           dataSource = jndi.lookup(databaseProps.getName(), DataSource.class);
       } catch (NamingException e) {
           logger.error("Exception loading JNDI datasource", e);
           throw e;
       }
       return dataSource;
   }

共有2个答案

钱星华
2023-03-14

尝试将数据源添加为@MockBean

@MockBean
private DataSource dataSource

这样,Spring将为您完成替换逻辑,其优点是您的生产代码bean创建甚至不会执行(无JNDI查找)。

姚树
2023-03-14

由于您正在加载配置类 MyApplication.class数据源 Bean,尝试在另一个未在测试中使用的 Bean 中移动数据源,请确保为测试加载的所有类都不依赖于数据源。
或者在
测试中创建一个标有@TestConfiguration的配置类,并将其包含在Spring启动(类=TestConfig.class)中模拟数据源,例如

@Bean
public DataSource dataSource() {
    return Mockito.mock(DataSource.class);
}

但是这可能会失败,因为对这个模拟数据的方法调用连接将返回null,在这种情况下,您必须在内存中创建一个数据源,然后模拟jdbcTemplate和其余依赖项。

 类似资料:
  • 所以我用了这个嵌入Kafka的例子,还有这个 我对这个示例做了一点更改,并用一些数据库(如h2db)更新了kafka侦听器。 现在在我的单元测试中,当我想检查数据在数据库中是否可用时,我得到NULL。另外,我不确定如何手动检查数据库,因为h2是一个内存基础数据库。 这是更新的部分:在接收器类中 在单元测试中: 但 dt 始终为空。此外,我也无法检查数据库,因为它在测试停止后停止。有人知道如何使它可

  • 未能配置Spring Boot进行集成测试。冷你请看一下下面的代码: 实体 存储 库 测试配置 应用程序属性 测试用例 我尝试了不同的配置(其最新版本),但一直出现相同的异常: 更奇怪的是,异常的本质是让spring boot根据实体注释自动生成模式。因此,在插入的时候,spring必须创建表,但是看起来它并没有创建。如果有人给我一个想法,我做错了什么,或者如果有人已经面临这样的问题-请让我知道。

  • 在我的项目中,我在进行单元测试时遇到了问题。一个问题是,仅仅进行联调就可以更快地编写,并且还可以测试组件是否真正协同工作。单元测试新颖的“算法”之类的似乎要容易得多。单元测试服务类感觉是错误和无用的。 我使用mockito来模拟spring数据存储库(以及DB访问)。问题是,如果我告诉模拟存储库在方法调用getById时返回实体A,它显然会返回实体A,服务也会返回实体A。是的,该服务做了一些额外的

  • 我正在将Grails2中的一系列单元测试升级到Grails3,并在使用Spock数据驱动测试格式驱动测试的域测试中遇到问题。 当我执行测试时,因为测试执行没有填充测试中的错误、字段和val引用。如前所述,这个测试适用于Grails2.5.5,所以我怀疑我缺少了Grails3中需要的一些东西。 Edited:我删除了原来在setup()中的mockForConstraints()调用,使其无效。

  • 问题内容: 我希望在编写用于测试某些数据库条目的单元测试中获得一些建议。 如果找不到记录,则我正在测试的功能会将数据库作为种子。 我似乎不太了解如何进行len测试。我正在使用测试数据库,因此我可以在任何时候都对其进行核对,因此,如果我只需要在函数上强制使用一个空的数据库,就没有问题了。 该函数本身可以正常工作,我只想确保已覆盖该函数。 任何建议都很好。 谢谢! 问题答案: 确实取决于您,有很多方法