Java Mockito如何验证lamba函数

Java Mockito如何验证lamba函数,java,junit,mockito,Java,Junit,Mockito,我正在尝试测试以下方法: public void execute(Publisher<T> publisher) throws Exception { PublishStrategy<T> publishStrategy = publisher.getPublishStrategy(); publishStrategy.execute(publisher::executionHandler); } 我不明白为什么mockito认为两个lambda是不同的

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

public void execute(Publisher<T> publisher) throws Exception {
    PublishStrategy<T> publishStrategy = publisher.getPublishStrategy();
    publishStrategy.execute(publisher::executionHandler);
}
我不明白为什么mockito认为两个lambda是不同的

更新 我没有使用
Mockito
就解决了这个问题

这是另一种方法<代码>省略空重写方法:

@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);
}
@测试
public void testExecute()引发异常{
PublishStrategy PublishStrategy=新PublishStrategy(){
@凌驾
public void execute(使用者处理程序){
Assert.assertNotNull(处理程序);
}
};
Publisher Publisher=new AbstractPublisher(){
@凌驾
public void init(PublishStrategy PublishStrategy){
this.publishStrategy=publishStrategy;
}
@凌驾
public void executionHandler(列表项){
}
@凌驾
公共发布策略getPublishStrategy(){
返回此.publishStrategy;
}
};
publisher.init(publishStrategy);
PublishJob作业=新PublishJob();
job.execute(publisher);
}

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

在您的例子中,该类PublishJob可能不会重写equals方法。因此,比较两个lambda实例的结果为false。注意:我真的不知道如何通过添加equals方法来解决这个问题

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


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

我如何模拟lambda执行?举个例子会很有帮助。我正在将publisher mock传递给publish作业的execute方法。Publisher包含executionHandler,Publisher对象在所有方面都是相同的。那么为什么McCiito认为它是2种不同的lambda?@尼勒斯巴莱看到我的更新。我不是在暗示lambda表达式。似乎mockito没有按照我们想要的方式处理这个场景。我在没有mockito的情况下尝试了同一个Junit,它的工作与预期的一样。请参阅帖子中的更新。@Nileshbara我没有对这个问题提出解决方案。你可以写一个自我回答,也许(只是可能;-)甚至去接受这个答案。问题应该是问题,答案就是答案。
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)
@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);
}