java - Spring JUnit 测试 .. 自动装配不起作用
问题描述
希望对发现这些测试引发错误的原因有所帮助..
我写了一个 Spring Boot RESTful 应用程序。我有用 JUnit 编写的集成测试(从 application.properties 读取配置)
控制器调用一个包含数据库访问的类
测试控制器工作正常..当我尝试直接测试数据库访问类时..我得到一个 BindException Failed to bind properties under 'spring.datasource'
@RequestMapping("/{source}/product")
Result prodBySource(@PathVariable String source, @RequestParam String prodId) throws Exception {
logger.debug(String.format("GET Product %s from %s. ", source, prodId)) ;
return productDb.getProd(prodId);
}
productDb 有
protected String getJson(String prodId) {
MapSqlParameterSource params = new MapSqlParameterSource()
.addValue("product_id", prodId);
String jsonString = "{}" ;
String jsonString = jdbcTemplate.queryForObject(query, params,
(rs, rowNum) -> {
return rs.getString("json_data") ;
});
return jsonString;
}
public Result getProd(String prodId) {
String jsonString = getJson(prodId);
Object jsonNode = JsonPath.parse(jsonString).json();
Result res = new Result(prodId, jsonNode) ;
return res;
}
JUnit 测试有
@RunWith(SpringRunner.class)
@SpringBootTest(classes= {ProductDb.class, AppConfig.class})
@TestPropertySource(locations =
"classpath:/com/broadridge/adc/fasttests/product/application-
fasttests.properties")
@ConfigurationProperties(prefix="spring.datasource")
@Category(com.broadridge.adc.product.FastTests.class)
public class ProductDbTest implements FastTests {
@Autowired
ProductDb lipperProductDb ;
@Test
public void getJson() throws Exception {
Result json =
lipperProductDb.getProd("30027978") ;
Supplier<String> messageSupplier = () -> {
return "Json can't be null";
};
Assert.notNull(json, messageSupplier);
}
解决方案
可能是您是自动装配接口而不是实现类。如果你测试 DAO 层应该模拟存储库/dao 对象。在测试该层期间不应进行实际的数据库调用,而是自动装配实际的 dao 对象,您应该模拟 ProductDb 并使用Mockito when(), thenReturn()。
@RunWith(SpringRunner.class)
@SpringBootTest(classes= {ProductDb.class, AppConfig.class})
@TestPropertySource(locations =
"classpath:/com/broadridge/adc/fasttests/product/application-
fasttests.properties")
@ConfigurationProperties(prefix="spring.datasource")
@Category(com.broadridge.adc.product.FastTests.class)
public class ProductDbTest implements FastTests {
@Mock
ProductDb lipperProductDb ;
@Test
public void getJson() throws Exception {
Result resultJson = new Result()//some result object
when(lipperProductDb.getProd("30027978")).thenReturn(resultJson);
Result json =
lipperProductDb.getProd("30027978") ;
Supplier<String> messageSupplier = () -> {
return "Json can't be null";
};
Assert.notNull(json, messageSupplier);
}
推荐阅读
- linux - 如何在 Redhat 上根据磁盘名称区分闪存盘
- ubuntu - snap-installed slack 在 xfce 面板中不显示图标
- javascript - 如何在javascript中将元素从一个数组复制到另一个数组?
- swift4 - 如何在swift 4中用所有大写字母分隔单词
- react-native - 您请求的体验使用 Expo SDK v(null),但此 Expo Client 副本至少需要 v23.0.0
- amazon-redshift - Redshift 创建没有基表的视图
- java-8 - 如何为 Java 8 并行流指定 ForkJoinPool?
- vb.net - 如何将字节写入数组,写入特定位置 vb.net
- wix - 根据提供的条件执行的 Wix 自定义操作 - 不工作
- bash - 为什么我的 sed 命令没有调用我的变量 c?