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);
}