在java中,当函数在更高级别上被调用时,如何显示函数参数?

brccelvz  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(453)

这个问题在这里已经有答案了

如何在java中获取当前堆栈跟踪(21个答案)
10天前关门了。
为了练习算法问题,我将java代码设置为:problemclass.java

public static void main(String[] args) {
        Solution solution = new ProblemClass().new Solution();
        Utils.isEqual(solution.function("abc"), "def");
}
public class {
    public Solution {
        public String function(String s) {}
    }
}

utils.isequal基本上是 Package 一个比较,如:

public static void isEqual(Object actual, Object expected) {
        if (actual == null && expected == null || actual.equals(expected)) {
            System.out.println("Pass.");
        } else {
            System.out.println("Fail. Expecting: [" + expected + "] Actual result: [" + actual + "]");
        }
    }

当我运行上百个测试用例时,我在命令提示符上看到的只是:

Pass.
Pass.
Pass.
Pass.
...
Fail. Expecting: [false] Actual result: [true]
...

我不知道哪个测试用例失败了。我想知道什么测试失败了。我愿意接受其他建议。到目前为止,我想也许有一种方法可以显示传入的参数 function 打电话的时候 isEqual 通过一些像反射的东西。我找不到一个明确的答案。
最后,我想把所有东西都放在main()中,这样我的所有测试和代码都放在一个地方,而不是有一个我必须管理的单元测试类。

w8ntj3qf

w8ntj3qf1#

不能访问调用者传递给另一个函数的参数:方法参数仅在方法仍在执行时存储;一旦一个方法完成了执行,保存它的参数的存储就会被回收并重新用于其他目的(比如下一个要执行的函数的参数/局部变量)。
因此,必须更改代码的结构,以便以某种方式将此值传递给需要它的函数。一种简单的方法是添加一个附加参数:

public static void assertEquals(String actual, String input, String expected) {
    if (Objects.equals(actual, expected) {
        System.out.println(input + ": pass");
    } else {
        System.out.println(input + ": failed. Expected: " + expected + ", but got " + actual);
    }
}

把它叫做:

assertEquals(solution.function("abc"), "abc", "def");

这是可行的,但需要将输入传递两次。避免这种情况的一种方法是传递解决方案,而不是直接调用其方法:

check(solution, "abc", "def");

哪里

check(Solution solution, String input, String expected) {
    String actual = solution.function(input);
    if (Objects.equals(expected, actual)) {
        System.out.println(input + ": pass");
    } else {
        System.out.println(input + ": failed. Expected: " + expected + ", but got " + actual);
    }
 }

然而,这仍然需要 check 要知道调用哪个方法( function 是我们的例子)。如果你需要的话 check 要使用任意方法,可以传递方法本身,而不仅仅是传递定义方法的对象:

check(solution::function, "abc", "def");

哪里

interface TestCase {
    String func(String input);
}

void check(TestCase test, String input, String expectedOutput) {
    String output = test.func(input);
    // compare and print as before
}

尽管如此,在专业代码中,您可能会使用junit之类的测试框架,而不是重新发明轮子。

相关问题