JUnit测试是否可以通过iff方法实现正确且递归的方法?

时间:2019-06-20 10:31:14

标签: java recursion junit

我正在设置一些实践考试,并且要求某些方法的实施必须递归。是否只有在方法的实现是递归的(当然是正确的)的情况下,JUnit测试才能通过?

我尝试使用android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { applicationId "xx" minSdkVersion 16 targetSdkVersion 26 versionCode 24 versionName "1.0.23" multiDexEnabled true ndk { abiFilters "armeabi-v7a", "x86" } manifestPlaceholders = [onesignal_app_id: "xx4", onesignal_google_project_number: "REMOTE"] } dependencies { compile project(':bugsnag-react-native') compile project(':lottie-react-native') compile project(':react-native-fast-image') compile project(':react-native-onesignal') compile project(':react-native-android-permissions') compile project(':react-native-fbsdk') compile project(':react-native-vector-icons') compile project(':react-native-image-picker') compile project(':react-native-iap') compile project(':react-native-camera') compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:26.0.2' compile 'com.facebook.react:react-native:+' compile 'com.android.support:multidex:1.0.0' implementation 'com.google.firebase:firebase-core:+' // From node_modules } ,但是我找不到找到程序早期调用方法的方法。 (因为我可以这样做,所以我可以检查以下示例中的getStackTrace()是否被调用了所需的次数)

MWP

containsDigit

我希望该测试通过递归实现,例如:

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);
    }

非常感谢您提供任何帮助或正确方向的指导。

1 个答案:

答案 0 :(得分:1)

JUnit本身没有工具来检查流是递归的还是迭代的,但是可以肯定地检查调用是否返回正确的结果。

现在也不可能从“较早的”执行中收集堆栈跟踪。

我也看不到模拟如何在这里为您提供帮助,但是我可能会遗漏一些东西,也许我们的同事会为此提供一个示例,但是我建议采用以下方法:

  • 不需要方法是静态的,而是要求方法是常规的。

然后使用以下技巧:

准备下节课,但不要将其提供给希望实施“服务”的学生(我认为这是出于教育目的,因为您已经谈论过考试,如果我错了,对不起) ”课程:

for(let i=0;i< this.state.counter; i++ {
  arr.push(component)
}
return arr

在JUnit中,测试MyServiceForChecks类而不是Service类。 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; } } 方法执行完后,您可以调用containsDigits方法并分析结果。

如果无法创建MyServiceForChecks类,则可以使用CGLIB库动态生成它。