Mockito cómo verificar las funciones lamba

Nilesh Barai:

Estoy tratando de prueba siguiente método:

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

A continuación se muestra el código 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);
}

En la llamada al método verificar, estoy consiguiendo siguiente excepción Mockito:

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)

No entiendo por qué Mockito considera tanto los de lambda son diferentes?

Actualización Lo resuelto sin utilizar Mockito.

Aquí está el otro enfoque. 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);
}
GhostCat saludos Monica C.:

En Java, dos objetos no son iguales porque son instancias de la misma clase! Los objetos son iguales porque llaman a.equals (b) devuelve verdadero!

En su caso, esa clase PublishJob probablemente no reemplazar el método iguales. Por lo tanto, la comparación de dos casos lambda resulta en falso. Y tenga en cuenta: Realmente no veo cómo se puede solucionar este problema mediante la adición de un método es igual.

En otras palabras: cuando haces publisher::executionHandlercrear dos instancias diferentes lambda. No importa que van a hacer una llamada a la vez en el mismo objeto. Tiene dos casos lambda. Y que simplemente no son iguales . Y que Mockito método comprueba la igualdad .

Creo que una manera de cómo probar esto: ver si se puede conseguir que la lambda para ser ejecutado. A continuación, compruebe que la llamada se espera tenga lugar en ese objeto.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=229697&siteId=1
Recomendado
Clasificación