如何验证特定的类方法是作为参数传递的?

Ant*_*ton 5 java unit-testing mockito java-8

在我测试的MyClass类中,我有:

public void execute(){
    service.call(ThisClass::method1);
}
Run Code Online (Sandbox Code Playgroud)

和以下:

void method1(){do 1;}
void method2(){do 2;}
Run Code Online (Sandbox Code Playgroud)

在测试中:

@Mock
Service service;

@Test
public void testCallMethod1()
{
     MyClass myClass = new MyClass();
     myClass.execute();

     service.verify(any(Runnable.class));
}
Run Code Online (Sandbox Code Playgroud)

它有效,但是,如何验证参数而不是任何Runnable是method1而不是method2?

我正在寻找看起来像的解决方案(例如,不是真的有效):

service.verify(eq(MyClass::method1.getRunnable()))
Run Code Online (Sandbox Code Playgroud)

Kev*_*ker 1

以下对我有用:

public class MyTest {

public static class X{
    static void method1() {};
    static void method2() {};
}

@Test
public void throwAway() {
  ExecutorService service = mock(ExecutorService.class);
  Runnable command1 = X::method1;
  Runnable command2 = X::method2;
  service.execute(command1);
  verify(service).execute(command1);
  verify(service, never()).execute(command2);
}
Run Code Online (Sandbox Code Playgroud)

}

关键是提取方法引用 lambda 并在执行和验证中使用它。否则,每个“::”运算符都会生成一个不同的 lambda 实例,该实例不适用于相等测试,因为上面的一些注释讨论了 lambda 相等的语义。