Java 如何使用mockito框架为VoltDb表和VoltDb结果编写mock?

Java 如何使用mockito框架为VoltDb表和VoltDb结果编写mock?,java,junit,mockito,junit4,voltdb,Java,Junit,Mockito,Junit4,Voltdb,我需要使用mockito框架为VoltDb过程编写测试用例。数据库以表数组的形式返回,我需要使用索引号从中获取表,然后迭代行以从列中获取值。所以,若我能得到一个模拟voltdb连接、表和结果的示例,那个就太棒了 Client-voltDbClient; @嘲弄 道场道场; @试验 public void testGetECMPWaitOverSelect()引发异常{ String procedure=“procedure Name is here”; int offset=Properties

我需要使用mockito框架为VoltDb过程编写测试用例。数据库以表数组的形式返回,我需要使用索引号从中获取表,然后迭代行以从列中获取值。所以,若我能得到一个模拟voltdb连接、表和结果的示例,那个就太棒了

Client-voltDbClient;
@嘲弄
道场道场;
@试验
public void testGetECMPWaitOverSelect()引发异常{
String procedure=“procedure Name is here”;
int offset=PropertiesLoader.getIntValue(PropertiesLoader.offset);
int fetchlimit=PropertiesLoader.getIntValue(PropertiesLoader.WAITOVER\u FETCH\u LIMIT);
Mockito.when(voltDbClient.callProcedure(procedure,offset,fetchlimit)).thenReturn(voltDbClient.callProcedure(procedure,offset,fetchlimit));
VoltTable[]VoltTable=voltDbClient.callProcedure(procedure,offset,fetchlimit).getResults();
Mockito.verify(voltDbClient,Mockito.times(1)).callProcedure(procedure,offset,fetchlimit);
}
我希望该表在类被模拟时得到模拟结果,并验证是否执行了db过程,但由于这不是正确的方法,我没有得到适当的结果。

在when(funcA())。然后返回(funcA())中,您似乎返回了相同的函数调用

您可能需要一些更像:-

        when(client.callProcedure("FOO.select", id)).thenReturn(new ClientResponse() {
        @Override
        public byte getStatus() {
            return ClientResponse.SUCCESS;
        }

        @Override
        public byte getAppStatus() {
            return 0;
        }

        @Override
        public VoltTable[] getResults() {
            VoltTable statusRow = new VoltTable(
                new VoltTable.ColumnInfo("StatusId", VoltType.INTEGER),
                new VoltTable.ColumnInfo("LAST_UPDATED", VoltType.TIMESTAMP),
                new VoltTable.ColumnInfo("VAL", VoltType.STRING)
            );
            statusRow.addRow(1, new TimestampType(new Date()), "Hello again");
            return new VoltTable[]{statusRow};
        }

        @Override
        public String getStatusString() {
            return null;
        }

        @Override
        public String getAppStatusString() {
            return null;
        }

        @Override
        public int getClusterRoundtrip() {
            return 0;
        }

        @Override
        public int getClientRoundtrip() {
            return 0;
        }

        @Override
        public long getClientRoundtripNanos() {
            return 0;
        }
    });
    response = client.callProcedure("FOO.select", id);
    VoltTable t = response.getResults()[0];
    assertEquals(t.getRowCount(), 1);
    t.advanceRow();
    long lastUpdatedMicros = t.getTimestampAsLong("LAST_UPDATED");
    long initialDateMicros = initialDate.getTime() * 1000;
    assertTrue(lastUpdatedMicros > initialDateMicros);
    String latestVal = t.getString("VAL");
    assertEquals(latestVal, val);

很抱歉,这是一个很晚的回复,但这可能会帮助您或其他人,如评论中所述,询问您想要测试什么。

您想在这里测试什么课程?看起来它可能是
voltDbClient
,但随后你会模仿它。你不应该模仿被测试的类。同样,带有
voltDbClient.callProcedure
的行也不合理。您可能需要添加被测试类、其依赖项和构造函数的代码示例。
voltDbClient.callProcedure
。这将调用一个已经为其分配了查询的过程并获得结果。但是您已经模拟了
voltDbClient
,因此它不会测试您的实际实现。(如果未模拟,则当或验证方法时,无法将其传递到Mockito的
)。还有
Mockito.when(voltDbClient.callProcedure(procedure,offset,fetchlimit)).thenReturn(voltDbClient.callProcedure(procedure,offset,fetchlimit))
在最好的情况下,它返回null,在最坏的情况下,您创建了一个无止境的循环。但实际上,mockito应该抱怨它告诉您:“在‘thenReturn’指令完成之前,您正在对另一个mock的行为进行截短。”