Java 如何使用mockito框架为VoltDb表和VoltDb结果编写mock?
我需要使用mockito框架为VoltDb过程编写测试用例。数据库以表数组的形式返回,我需要使用索引号从中获取表,然后迭代行以从列中获取值。所以,若我能得到一个模拟voltdb连接、表和结果的示例,那个就太棒了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
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的行为进行截短。”