Mockito如何验证Lamba功能

Nil*_*rai 5 java junit mockito

我正在尝试测试以下方法:

public void execute(Publisher<T> publisher) throws Exception {
    PublishStrategy<T> publishStrategy = publisher.getPublishStrategy();
    publishStrategy.execute(publisher::executionHandler);
}
Run Code Online (Sandbox Code Playgroud)

以下是Junit代码:

@Test
public void testExecute() throws Exception {
    PublishStrategy<Event> publishStrategy = Mockito.mock(PublishStrategy.class);
    Publisher<Event> publisher = Mockito.mock(Publisher.class);
    Mockito.when(publisher.getPublishStrategy()).thenReturn(publishStrategy);
    Mockito.doNothing().when(publishStrategy).execute(publisher::executionHandler);
    PublishJob job = new PublishJob(publisher);
    job.execute(publisher);
    Mockito.verify(publishStrategy, Mockito.times(1)).execute(publisher::executionHandler);
}
Run Code Online (Sandbox Code Playgroud)

在verify方法调用上,我得到以下模仿异常:

Argument(s) are different! Wanted:
publishStrategy.execute(
    com.test.producer.jobs.PublishJobTest$$Lambda$3/1146825051@6f45df59
);
-> at com.test.producer.jobs.PublishJobTest.testExecute(PublishJobTest.java:23)
Actual invocation has different arguments:
publishStrategy.execute(
    com.producer.jobs.PublishJob$$Lambda$2/1525409936@38e79ae3
);
-> at com.producer.jobs.PublishJob.execute(PublishJob.java:30)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么Mockito认为两个Lambda都不同?

更新 我不使用解决了它Mockito

这是另一种方法。Omitted empty overridden methods

@Test
public void testExecute() throws Exception {
    PublishStrategy<Event> publishStrategy = new PublishStrategy<Event>() {
        @Override
        public void execute(Consumer<List<Event>> handler) {
            Assert.assertNotNull(handler);
        }
    };
    Publisher<Event> publisher = new AbstractPublisher<Event>() {
        @Override
        public void init(PublishStrategy<Event> publishStrategy) {
            this.publishStrategy = publishStrategy;
        }

        @Override
        public void executionHandler(List<IngestEvent> items) {

        }

        @Override
        public PublishStrategy<IngestEvent> getPublishStrategy() {
            return this.publishStrategy;
        }
    };
    publisher.init(publishStrategy);
    PublishJob job = new PublishJob();
    job.execute(publisher);
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 3

在 Java 中,两个对象不相等,因为它们是同一类的实例!对象相等,因为调用a.equals(b)返回 true!

在您的情况下,该类PublishJob可能不会覆盖 equals 方法。因此,比较两个 lambda 实例会导致 false。注意:我真的不知道如何通过添加 equals 方法来解决这个问题。

换句话说:当您这样做时,publisher::executionHandler您创建了两个不同的 lambda 实例。它们都对同一个对象进行调用并不重要。您有两个lambda 实例。而且他们根本不平等。Mockito 方法检查相等性

我想一种测试方法:看看是否可以执行该 lambda。然后验证该对象上是否发生了预期的调用。