我试着模仿这个方法,但我不知道如何构建这个... 我使用Mockito和jUnit。
有没有办法以简单的方式做到这一点?
非常感谢。
public Object getColumnValue(ReportRow row, String columnId, Vector errors)
{
if (HSBC_PAYREC.equals(columnId)) {
String s = (String) getColumnValue(row, "Pay/Rcv", errors);
if (s != null) {
if (s.equals("Pay")) {
return "Receive";
}
}
return "";
}
}
答案 0 :(得分:3)
因为您正在测试正在测试的系统,所以模拟被测系统真的没有意义。我认为可以说这包括模拟对被测系统的递归调用。 (除了在哲学上非常奇怪之外,您可能很难确保从测试中调用未模拟的版本,同时确保在模拟版本调用自身时,未模拟的版本调用模拟版本。)您最好的选择是重构您的测试,以便递归行为是您预期行为的一部分。
尽管如此,虽然它确实使代码更难以遵循,但您确实有两种选择。一个涉及部分模拟:
public Object getColumnValue(ReportRow row, String columnId, Vector errors) {
if (HSBC_PAYREC.equals(columnId)) {
String s = (String) getColumnValueRecursively(row, "Pay/Rcv", errors);
if (s != null) {
if (s.equals("Pay")) {
return "Receive";
}
if (s.equals("Receive")) {
return "Pay";
}
return "";
}
}
}
/** For testing. */
Object getColumnValueRecursively(ReportRow row, String columnId, Vector errors) {
return getColumnValue(row, columnId, errors);
}
在测试中:
@Test public void yourTest() {
SystemUnderTest yourSystemUnderTest = Mockito.spy(new SystemUnderTest());
doReturn(yourMockedValue).when(yourSystemUnderTest).getColumnValueRecursively(
/* your recursive base case */);
// ...
}
从技术上讲,我认为你可以在不创建间接递归的情况下做到这一点,但是你会根据参数切换行为,这使得确保测试有效变得更加困难。你的另一个选择同样棘手:
SystemUnderTest recursiveInstance = this; // replace with a mock within test
public Object getColumnValue(ReportRow row, String columnId, Vector errors) {
if (HSBC_PAYREC.equals(columnId)) {
String s = (String) recursiveInstance.getColumnValue(row, "Pay/Rcv", errors);
if (s != null) {
if (s.equals("Pay")) {
return "Receive";
}
if (s.equals("Receive")) {
return "Pay";
}
return "";
}
}
}
答案 1 :(得分:0)
为了模拟递归调用,您可以使用间接递归,如下所示:
private Object indirectGetColumnValue(ReportRow row, String columnId, Vector errors) {
return getColumnValue(row, "Pay/Rcv", errors);
}
public Object getColumnValue(ReportRow row, String columnId, Vector errors) {
if (HSBC_PAYREC.equals(columnId)) {
String s = (String) indirectGetColumnValue(row, "Pay/Rcv", errors);
if (s != null) {
if (s.equals("Pay")) {
return "Receive";
}
if (s.equals("Receive")) {
return "Pay";
}
}
return "";
}
}
然后,您可以模拟indirectGetColumnValue
方法。我不是说这是首选方法,因为通过引入此间接递归调用使您的代码可读性降低。但是,这是测试它的一种方法。