java - 单元测试中的 Spring Boot 数据源

标签 java spring unit-testing spring-boot mockito

我有一个简单的 Spring Boot 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
}

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

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

用于测试的内存数据库不是一个选项,因为我的数据库创建脚本具有特定的结构,无法从类路径轻松执行:schema.sql

编辑 数据源在 MyApplication.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;
   }

最佳答案

由于您正在加载配置类 MyApplication.class 数据源 bean 将被创建,请尝试将数据源移动到另一个未在测试中使用的 bean 中,确保为测试加载的所有类都不依赖于datasource.

在你的测试中创建一个配置类标记为 @TestConfiguration 并将其包含在 SpringBootTest(classes=TestConfig.class) 模拟数据中源那里像

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

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

关于java - 单元测试中的 Spring Boot 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49559185/

相关文章:

java - 如何使用 SQL 调用以数组作为参数的 pl/SQL 函数

java - 无法在 NavigationFilter 之后在 JTextField 上设置选择

具有火焰图输出的 java 分析器

ruby-on-rails - 在 Ruby on Rails 中,您测试 Controller 和 View 还是大多数模型?

python - Python单元测试在什么情况下运行失败?

java - 在 Java 11 中声明不可变 linkedhashmap 的任何方式

java - 如何使用 Spring Data 在 MongoDB 中的继承字段上定义索引?

Spring Cassandra ddl-auto

spring data mongodb,使用 MongoRepository 还是 MongoTemplate?

java - 使用 Mock 框架编写单元测试的最佳实践是什么