单元测试中的Spring Boot数据源

我有一个简单的Spring Boot" title="Spring Boot">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。通常,我想避免为此测试创建数据源,因为我模拟了存储库。

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

在内存数据库中进行测试不是一个选择,因为我的数据库创建脚本具有特定的结构,无法从classpath: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中,确保为测试加载的所有类均不依赖于数据源。

或者

在您的测试中,创建一个标有的配置类,@TestConfiguration并将其包含在SpringBootTest(classes=TestConfig.class)模拟数据源中,例如

@Bean

public DataSource dataSource() {

return Mockito.mock(DataSource.class);

}

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

以上是 单元测试中的Spring Boot数据源 的全部内容, 来源链接: utcz.com/qa/434522.html

回到顶部