【发布时间】:2021-01-15 12:40:56
【问题描述】:
我是 Spock 框架的新手,正在编写一个测试用例,我试图在其中模拟一个名为 QueryDatabase 的类
public class QueryDatabase {
public BigInteger countRecords(Instant start, Instant end) {
Flux<CountRecord> countValue = query("select * from users");
Optional<Object> value = Optional.ofNullable(countValue.blockFirst()).map(CountRecord::getValue);
BigInteger count = value.filter(BigInteger.class::isInstance)
.map(BigInteger.class::cast).orElse(BigInteger.valueOf(0));
return count
}
public Flux<CountRecord> query(String query) {
}
}
但是下面的测试用例是检查 countRecords(Instant, Instant) 返回的值总是给出 0,这意味着在 when 部分中返回的值
recordCount.query(_) >> Flux.just(CountRecord.builder().value(new BigInteger(133)).build())
没有被使用,似乎recordCount.query(_) >> Flux.empty()也没有任何影响,它总是返回默认的BigInteger值0
def "record count"() {
given:
def now = Instant.now()
def last10Minutes = now.minus(10, ChronoUnit.MINUTES);
def recordCount = Stub(QueryDatabase)
when: "query returning empty flux"
recordCount.query(_) >> Flux.empty()
then:
recordCount.countRecords(last10Minutes, now) == 0
when: "query returning the count record"
recordCount.query(_) >> Flux.just(CountRecord.builder().value(new BigInteger(133)).build())
then:
recordCount.countRecords(last10Minutes, now) == 133
}
我在这里做错了吗?
【问题讨论】:
标签: java unit-testing mocking spock stubbing