我正在使用Mockrunner来模拟Sql DB进行单元测试。以下是我的查询:

"select * from table where userId in (" + userIds + ")"


现在,我的userIds取决于状态。我不需要依赖于列表内部排列的测试用例-userIds。因此,我不需要完全匹配,而是正则表达式匹配。我已经通过以下代码启用了正则表达式匹配:

    StatementResultSetHandler statementHandler = connection.getStatementResultSetHandler();
    usersResult = statementHandler.createResultSet("users");
    statementHandler.setUseRegularExpressions(true);
    //How to write this regex query?
    statementHandler.prepareResultSet("select * from table where userId in .*", campaignsResult);


但是请注意,我对Mockrunner支持的正则表达式语法一无所知。

编辑:我无法将"Select * from tables"之类的查询与"Select * from tab .*"进行匹配。所以它必须与我在Mockrunner中使用正则表达式的方式有关

最佳答案

有一些有用的示例available here。例如:

public void testCorrectSQL() throws Exception {
    MockResultSet result = getStatementResultSetHandler().createResultSet();
    getStatementResultSetHandler().prepareResultSet("select.*isbn,.*quantity.*", result);
    List orderList = new ArrayList();
    orderList.add("1234567890");
    orderList.add("1111111111");
    Bookstore.order(getJDBCMockObjectFactory().getMockConnection(), orderList);
    verifySQLStatementExecuted("select.*isbn,.*quantity.*\\(isbn='1234567890'.*or.*isbn='1111111111'\\)");
}


由此,我推测它正在使用标准Java regex syntax。在这种情况下,您可能需要:

prepareResultSet("select \\* from table where userId in \\(.*\\)", campaignsResult);


...或者可能更简洁(并取决于测试的精确程度):

prepareResultSet("select .* from table where userId in .*", campaignsResult);


启用正则表达式匹配时要注意的主要警告是,查询中需要的任何文字特殊字符(例如*()文字)都必须先在正则表达式中转义将正常工作。

10-05 22:52