java - 有没有办法让 JUnit 测试通过 iff 方法实现是正确的和递归的?
问题描述
我正在设置一些实践考试,并要求实施某些递归方法。只有当方法的实现是递归的(当然是正确的)时,JUnit 测试是否可以通过?
我已经尝试过使用getStackTrace()
,但我找不到一种方法来获取程序早期进行的方法调用。(因为如果我能做到这一点,我可以检查containsDigit
以下示例中是否被调用了所需的次数)
MWP
import static org.junit.Assert.*;
import org.junit.*;
import java.io.*;
import java.text.*;
import java.util.*;
import org.junit.rules.*;
import java.lang.reflect.*;
public class Service { //begin class
/**
* @param n: assumed to be more than 0
* @param d, d >= 0 and d <= 9
* @return true if number n contains the digit d, false otherwise
* you may assume that 0 itself doesn't contain ANY digit (not even 0)
* NOTE: This method must be implemented recursively.
* hint: n%10 gives the last digit, n/10 gives the rest of the number
*/
public static boolean containsDigit(int n, int d) {
return false; //to be completed
}
@Test
public void testContainsDigit() {
assertTrue(Service.containsDigit(1729, 1));
assertTrue(Service.containsDigit(1234567890, 2));
assertFalse(Service.containsDigit(1729, 8));
}
}
我希望测试通过递归实现,例如:
public static boolean containsDigit(int n, int d) {
if(n == 0)
return false;
if(n%10 == d)
return true;
return containsDigit(n/10, d);
}
并且迭代(即使正确)实现失败,例如:
public static boolean containsDigit(int n, int d) {
while(n > 0) {
if(n%10 == d) {
return true;
}
n/=10;
}
return false;
}
任何帮助或正确方向的指导将不胜感激。
解决方案
JUnit 本身没有检查流程是递归还是迭代的工具,但它肯定可以检查调用是否返回正确的结果。
现在也不可能从“早期”执行中收集堆栈跟踪。
我也看不到模拟如何在这里为您提供帮助,但是我可能会遗漏一些东西,也许我们的同事会为此提供一个示例,但是我建议采用以下方法:
- 不要求方法是静态的,而是要求方法是常规的。
然后使用以下技巧:
准备以下课程,但不要将其提供给预计实施“服务”课程的学生(我认为这是出于教育目的,因为您已经谈到了考试,如果我错了,请见谅):
class MyServiceForChecks extends Service {
private List<StackTraceElement[]> invocationStackTraces = new ArrayList<>();
public boolean containsDigit(int n, int d) { // its not static anymore
StackTraceElement [] stackTrace = getStackTrace();
invocationStackTraces.add(stackTrace);
return super.containsDigit(n,d);
}
public List<StackTraceElement[]> getInvocationStackTraces () {
return this.invocationStackTraces;
}
}
在 JUnit 中测试 MyServiceForChecks 类而不是 Service 类。在containsDigits
方法完成执行后,您可以调用getInvocationStackTraces
方法并分析结果。
如果您无法创建 MyServiceForChecks 类,您可以使用 CGLIB 库动态生成它。
推荐阅读
- python - 我如何使用另一个类的魔法方法?
- talend - Talend 在 TAC 安排时不会更新表,但在 Talend Studio 会更新
- java - 如何配置 Firebase Auth 对话框的超链接
- vagrant - 使用 libvirt 的 Vagrant 公共网络
- mongodb - 从 mongo 到 bigquery 的 ETL
- node.js - 我的路由器之外的其他设备如何连接到我的服务器
- linux - yum 错误 [Errno 14] 对等证书无法验证或对等证书无效
- sas - 试图解析 SAS 中两个特定字符串之间的特定短语
- r - 如何让 VS Code 使用 R 扩展检查语法错误?
- reactjs - 如何在反应应用程序中更改和导入外部回购