【发布时间】:2018-03-15 14:44:35
【问题描述】:
我正在尝试使用 spock 框架对一些 java 类进行单元测试。结构如下:
-
com.myorg.requests(类名:RequestProcessor) -
com.myorg.query(类名:DatabaseQuery)
第一个类看起来像这样:
public class RequestProcessor {
private String request;
public RequestProcessor(String aRequest) {
this.request = request;
}
public String processRequest() {
String response ;
//do something here
try {
if(condition meets) {
response = executeRequest();
}
} catch ( various exceptions... ) {
System.out.println("something went wrong...");
}
}
private String executeRequest() throws <<exceptions thrown by DatabaseQuery>> {
//do something here
DatabaseQuery queryResult = new DatabaseQuery(request)
}
}
我正在尝试为这个依赖于DatabaseQuery 的RequestProcessor 类编写Spock 测试。我正在考虑模拟 DatabaseQuery 类,以便单独测试 RequestProcessor 类。
正在调用RequestProcessor 的processRequest() 方法,该方法依赖于另一个私有方法。该方法将使用DatabaseQuery 来获取实际的查询结果。这就是我的 Spock 测试的样子:
class RequestProcessorSpec extends Specification {
//Class to be tested
RequestProcessor requestProcessor
//Dependencies
DatabaseQuery dbquery
def "Given a valid request, dbquery's executeQuery method is called" () {
given: "a valid request"
def queryRequest = '{"info1":"value1","info2":"value2","query":"select * from users"}'
and: "mock the DBQuery class"
dbquery = Mock(DatabaseQuery)
and: "create a new request"
requestProcessor = new RequestProcessor(queryRequest)
when: "the request is processed"
requestHandler.processRequest()
then: "dbquery executeQuery method is called"
1 * dbquery.executeQuery(_ as String)
}
}
这并不完全适合我。我收到一个错误:
- 调用太少
- 不匹配的调用
当我使用gradlew test --info 运行测试以获得更多结果时,我看到控制台上打印了一条日志,该日志由processRequest 方法中的try-catch 语句捕获。
我在这里做错了什么?
【问题讨论】:
标签: java unit-testing mocking spock