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

时间:2016-11-09 12:17:22

标签: java unit-testing java-8 mockito

在我测试的MyClass类中:

public void execute(){
    service.call(ThisClass::method1);
}

以下:

void method1(){do 1;}
void method2(){do 2;}

在测试中:

@Mock
Service service;

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

     service.verify(any(Runnable.class));
}

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

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

service.verify(eq(MyClass::method1.getRunnable()))

1 个答案:

答案 0 :(得分: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);
}

}

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