我有一個服務類,它使用 JdbcTemplate 使用產品 ID 執行搜索并回傳匹配的產品。
這是課程
@RequiredArgsConstructor
@Service 公共類 ProductService {
private final QueryBuilderUtility queryBuilderUtility;
private final JdbcTemplate productJdbcTemplate;
public ProductService(@Qualifier("productJdbcTemplate") JdbcTemplate productJdbcTemplate, QueryBuilderUtility queryBuilderUtility) {
this.productJdbcTemplate = productJdbcTemplate;
this.queryBuilderUtility = queryBuilderUtility;
}
public List<Product> findProducts(List<Long> productCodes) {
String productQuery = queryBuilderUtility.buildSelectQuery(productCodes);
List<Product> products = productJdbcTemplate.query( productQuery, new ProductRowMapper(), productCodes.toArray());
return products;
}
這是測驗類:
class ProductServiceSpec extends Specification {
JdbcTemplate jdbcTemplate = Mock()
QueryBuilderUtility queryBuilderUtility = Mock()
ProductService productService
List<Long> productCodes = [33334L, 66754L, 56772L]
TestUtil testUtil = new TestUtil();
List<Product> products = testUtil.createProducts()
def setup(){
productService = new ProductService( jdbcTemplate, queryBuilderUtility)
}
def 'Find Products for product codes'(){
given:
1 * jdbcTemplate.query(_ as String, _ as ProductRowMapper, _ as Object []) >> products
when:
//1 * jdbcTemplate.query(_ as String, _ as ProductRowMapper, _ as Long []) >> products
assert products.size() == 3
List<Product> result = productService.findProducts(productCodes)
println "Result is ${result}" // empty list
then:
1 == 1
}
}
我嘗試使用 jdbcTemplate 的存根來回傳這樣的產品串列,但串列為空
List<Product> products = ...
JdbcTemplate jdbcTemplate = Stub()
jdbcTemplate.query(_ as String, _ as ProductRowMapper, _ as Long []) >> products
但是,當我除錯時,它回傳一個大小為 0 的產品串列,即使產品串列中有 3 個元素。這是預期的嗎?如果是這樣,這是否意味著無法在 Spock 中模擬或存根 JdbcTemplate?如果有人可以幫助我解決這個問題,我將不勝感激。
我也試過了,但沒有用;
JdbcTemplate template = Mock()
1 * template.query(_ as String, _ as ProductRowMapper, _ as Object[]) >> products
和
1 * template.query(_ as String, _ as ProductRowMapper, _ as Long[]) >> products
uj5u.com熱心網友回復:
您將 定義QueryBuilderUtility
為模擬:
QueryBuilderUtility queryBuilderUtility = Mock()
即,每個方法呼叫都回傳null
. 因此,您要么需要使用真正的查詢構建器實用程式而不是模擬,要么確保存根方法結果,例如
def 'Find Products for product codes'() {
given:
1 * jdbcTemplate.query(_ as String, _ as ProductRowMapper, _ as Object[]) >> products
queryBuilderUtility.buildSelectQuery(_) >> "my query"
expect:
productService.findProducts(productCodes).size() == 3
}
現在測驗應該通過了。
順便說一句:在這種簡單的情況下,您似乎不需要對每個方法引數進行任何值約束,您jdbcTemplate.query
也_
可以簡單地撰寫:
1 * jdbcTemplate.query(*_) >> products
更新:查看我創建的幾個虛擬類的完整示例專案,以使您的示例代碼作業:
在Groovy Web 控制臺中嘗試一下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/460504.html