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)
在 Java 中,两个对象不相等,因为它们是同一类的实例!对象相等,因为调用a.equals(b)返回 true!
在您的情况下,该类PublishJob可能不会覆盖 equals 方法。因此,比较两个 lambda 实例会导致 false。注意:我真的不知道如何通过添加 equals 方法来解决这个问题。
换句话说:当您这样做时,publisher::executionHandler
您创建了两个不同的 lambda 实例。它们都对同一个对象进行调用并不重要。您有两个lambda 实例。而且他们根本不平等。Mockito 方法检查相等性。
我想一种测试方法:看看是否可以执行该 lambda。然后验证该对象上是否发生了预期的调用。
归档时间: |
|
查看次数: |
57 次 |
最近记录: |