在Java中,在更高级别调用函数时,如何显示函数参数?

在Java中,在更高级别调用函数时,如何显示函数参数?,java,Java,为了练习算法问题,我将Java代码设置为: ProblemClass.java public static void main(String[] args) { Solution solution = new ProblemClass().new Solution(); Utils.isEqual(solution.function("abc"), "def"); } public class { public So

为了练习算法问题,我将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基本上包含了如下比较:

    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]
...
我不知道哪个测试用例失败了。我想知道什么测试失败了。我愿意接受其他建议。到目前为止,我认为可能有一种方法可以通过反射之类的方式显示调用
isEqual
时传递到
function
的参数。我找不到一个明确的答案


最后,我想把所有的东西都保存在main()中,这样我所有的测试和代码都放在一个地方,而不是有一个我必须管理的单元测试类。

你不能访问调用者传递给另一个函数的参数:方法参数只在方法仍在执行时存储;方法完成执行后,保存其参数的存储将被回收并重新用于其他目的(例如下一个要执行的函数的参数/局部变量)

因此,您必须更改代码的结构,以便以某种方式将此值传递给需要它的函数。一种简单的方法是添加一个附加参数:

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
来知道调用哪个方法(
函数
就是我们的例子)。如果需要
检查
来处理任意方法,则可以传递方法本身,而不仅仅是传递定义它的对象:

check(solution::function, "abc", "def");
在哪里


综上所述,在专业代码中,您可能会使用junit之类的测试框架,而不是重新发明轮子。

您可以在断言中包含一条“消息”。但是,使用测试框架,比如JUnit或TestNG,不是更容易吗?这个问题与“如何在Java中获取当前堆栈跟踪”类似吗?我没有投票关闭,但我猜是因为如果在断言中转储堆栈跟踪,那么您可以准确地跟踪哪个测试失败。但如果可以的话,我仍然建议使用测试框架。
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
}