是否可以比较两个空的 Runnable 是否相等?

Is it possible to compare two empty Runnable for equality?

我有一个 return 是 Runnable 的方法。在某些情况下,它将 return 一个空的 runnable (() -> {}),我想测试这些情况是否得到很好的尊重。

因此,我想做一些简单的单元测试,例如:

private static final Runnable EMPTY = () -> {};

@Test
public void test() {
    Runnable action = myObject.myMethod(myParameters);
    assertEquals(EMPTY, action);
}

上面的方法显然不起作用,因为 Runnable 是一个函数式接口,我想我最终要重写 equals 方法,否则我将只调用那个方法superclass Object 的,因此我的断言会失败。

一方面,我知道很难(或者根本不可能?)测试两个可能包含任何内容的可运行对象的相等性。 另一方面,我真的很想测试 runnable 是否为空,没有别的。

所以现在,我在 myObject class 上创建了一个 public static final Runnable EMPTY,当我需要时 return:

public class MyObject {
    public static final Runnable EMPTY = () -> {};
    
    public Runnable myMethod(MyParameters myParameters) {
        if (something) {
            return EMPTY;
        }
        //...
        if (somethingElse) {
            return EMPTY;
        }
        //...
        return anotherRunnable;
    }
}

然后我从测试中引用了这个实例,它适用于有限数量的测试:

assertEquals(MyObject.EMPTY, action);

但是 Runnable 可能有一天也会从外部提供,这意味着我无法控制空的可运行对象正是我的静态空实例这一事实,在这种情况下我真的会需要知道提供的runnable是否为空。

有什么想法吗?我要求的东西是不可能的吗?

简答:不可能

长答案:这是可能的,但您不想这样做,因为您必须为上述 Runnable 反汇编 class 文件并检查方法体。这是太多的努力。应该有更简单的方法来达到你想要的结果。