每次运行 SQL 语句时更改模拟结果集值



我正在使用Mockrunner为选择语句创建模拟结果集。我有一个执行 select 语句(返回单个值(的循环。我想让结果集每次都返回不同的值,但我无法找到有关如何根据调用语句的时间来指定结果集返回值的任何内容。下面是代码的伪代码片段:

在测试代码中:

String selectSQL = "someselectStmt";
StatementResultSetHandler stmtHandler = conn.GetStatementResultSetHandler();
MockResultSet result = stmtHandler.createResultSet();
result.addRow(new Integer[]{new Integer(1)});
stmtHandler.prepareResultSet(selectSQL, result);

在实际目标类中:

Integer[] Results = getResults(selectSQL);
while(Results.length != 0){
    //do some stuff that change what gets returned in the select stmt
    Results = getResults(selectSQL)
}

所以基本上我想在第一次通过时返回 1,在第二次返回 2,在 3 时什么都没有。到目前为止,我还没有找到任何可以利用的东西来实现这一目标。模拟的 select 语句将始终返回要与之关联的最后一个结果集的任何内容(例如,如果我创建了两个 MockResultSet 并将这两个结果集与相同的选择 stmt 相关联(。这个想法可能吗?

在 Java 和 SQL 中工作的循环控制流

如果你用 Java 编写这个代码,一种使代码执行调用返回不同的排序结果的方法可以通过循环控制流语句(如 do-while-loop(来完成。 这个维基百科参考文献有一个很好的讨论,使用了Java中实现和不同编程语言中实现之间的do-while-loop的对比。

通过观察的一些额外影响:

使用Mockrunner工具的线索:

模拟选择语句将始终返回最后一个结果集与之关联的任何内容(例如,如果我创建了两个 MockResultSet 并且都与相同的选择 stmt(

之所以如此,是因为 SELECT 语句实际上也必须更改,否则重复查询也将重复结果输出。 一个线索是,您的 SQL 在整个代码执行过程中作为文本字符串值存在。 字符串可以通过代码和简单的字符串操作来更改。

String selectSQL = "someselectStmt";
StatementResultSetHandler stmtHandler = conn.GetStatementResultSetHandler();
MockResultSet result = stmtHandler.createResultSet();
result.addRow(new Integer[]{new Integer(1)});
stmtHandler.prepareResultSet(selectSQL, result);

除了 selectSQL 变量之外,还要为数值变量添加一行,以跟踪 SQL 语句的执行次数:

Int queryLoopCount = 0;

在以下目标类中:

Integer[] Results = getResults(selectSQL);
while(Results.length != 0){
//do some stuff that change what gets returned in the select stmt
Results = getResults(selectSQL)
}

尝试按照此示例重写此WHILE循环控件。在伪代码中,您将继续从对getResults(selectSQL);的调用中提取相同的数据,因为查询在每次通过代码的过程中都保持不变。

设置测试架构和示例 SQL 语句

下面是使用单个MySQL表进行的小检查,该表包含要馈送到某个结果集中的"testdata"输出。 ID列可以是唯一标识每个不同记录或"测试用例"的方法

SQL 小提琴

MySQL 5.5.32 架构设置

CREATE TABLE testCaseData 
    (
     id int primary key,
     testdata_col1 int,
     testdata_col2 varchar(20),
     details varchar(30)
    );
INSERT INTO testCaseData
(id, testdata_col1, testdata_col2, details)
VALUES
(1, 2021, 'alkaline gab', 'First Test'),
(2, 322, 'rebuked girdle', '2nd Test'),
(3, 123, 'municipal shunning', '3rd Test'),
(4, 4040, 'regal limerick', 'Skip Test'),
(5, 5550, 'admonished hundredth', '5th Test'),
(6, 98, 'docile pushover', '6th Test'),
(7, 21, 'mousiest festivity', 'Last Test');
commit;

查询 1 查看所有测试数据

SELECT id, testdata_col1, testdata_col2, details
  FROM testCaseData

结果

| ID | TESTDATA_COL1 |        TESTDATA_COL2 |    DETAILS |
|----|---------------|----------------------|------------|
|  1 |          2021 |         alkaline gab | First Test |
|  2 |           322 |       rebuked girdle |   2nd Test |
|  3 |           123 |   municipal shunning |   3rd Test |
|  4 |          4040 |       regal limerick |  Skip Test |
|  5 |          5550 | admonished hundredth |   5th Test |
|  6 |            98 |      docile pushover |   6th Test |
|  7 |            21 |   mousiest festivity |  Last Test |
查询

2 仅查询表中的第一条记录

SELECT id, testdata_col1, testdata_col2, details
  FROM testCaseData
 WHERE id = 1

结果

| ID | TESTDATA_COL1 | TESTDATA_COL2 |    DETAILS |
|----|---------------|---------------|------------|
|  1 |          2021 |  alkaline gab | First Test |
查询

3 查询表中的特定测试记录

SELECT id, testdata_col1, testdata_col2, details
  FROM testCaseData
 WHERE id = 2

结果

| ID | TESTDATA_COL1 |  TESTDATA_COL2 |  DETAILS |
|----|---------------|----------------|----------|
|  2 |           322 | rebuked girdle | 2nd Test |

查询 4 返回并限制输出集大小

SELECT id, testdata_col1, testdata_col2, details
  FROM testCaseData
 WHERE id < 5

结果

| ID | TESTDATA_COL1 |      TESTDATA_COL2 |    DETAILS |
|----|---------------|--------------------|------------|
|  1 |          2021 |       alkaline gab | First Test |
|  2 |           322 |     rebuked girdle |   2nd Test |
|  3 |           123 | municipal shunning |   3rd Test |
|  4 |          4040 |     regal limerick |  Skip Test |

编写参数化 SQL 语句

我不知道这种语法差异是否会产生与您的伪代码完全相同的结果,但我从我知道已经有效的代码结构的参考中推荐它。

set condition value before loop
do{
    // do some work
    // update condition value
}while(condition);

WHILE条件位于语句的末尾,应基于对循环块内值的更改。 我们现在将介绍第二个变量,一个跟踪循环迭代次数的 int:

String selectSQL = "someselectStmt";
String[] Results; = getResults(selectSQL);
// set condition value before loop 
queryLoopCount = 0
do{
    // do some work
    Results = getResults(selectSQL);
    // update condition value
    queryLoopCount = queryLoopcount + 1;
}while(queryLoopCount < 6);

selectSQL来自哪里:

SELECT id, testdata_col1, testdata_col2, details
  FROM testCaseData
 WHERE id = 2;

并通过内置参数适应:

selectSQL = 'SELECT id, testdata_col1, testdata_col2, details
  FROM testCaseData
 WHERE id = ' + queryLoopCount;

混合字符串和整数值可能不是问题,因为在此参考中对 concatenated(+( 值的建议:任何连接到字符串的内容都会转换为字符串(例如,"重量 = " + 千克(。

专业案例要求的想法

  • 您可以引入自己的编号序列,以获取每个案例的记录,以便在参考表中循环。通过引入 ORDER BY 语句并更改键ORDER BY值,有很多可能性。

  • "跳过"案例。 在 Do-While 循环中,添加 IF-THEN 语句以有条件地跳过特定记录。

    set condition value before loop
    do{
        if ( queryLoopCount <> 4 ) {
        // do some work}
        // update condition value
        queryLoopCount = queryLoopCount + 1;
    }while(condition);
    

    使用 if-then 循环,此代码示例将处理所有测试记录,但将跳过 ID = 4 的记录并继续,直到满足 while 循环条件。

最新更新