Как смоделировать аргумент Consumer, используя EasyMock с PowerMock - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть тестовый сценарий, в котором мне нужно смоделировать параметр Consumer.

В следующем коде startTracer - это метод для тестирования.

class TracerService {

    private TracerController tracerController;

    public void startTracer(String tracerName, Object param1) {
        if (attendStartConditions(tracerName, param1)) {
            executeOnTracerControllerScope(tracerController -> tracerController.startTracer(param1));
        }
    }
    ...
}

По сути, яхотите проверить, получает ли tracerController.startTracer(param1) param1 в качестве аргумента.

Capture<Object> method1Param1 = newCapture();
tracerController.startTracer(capture(method1Param1));
expectLastCall().once();
...
tracerService.startTracer("TEST", "value1");
assertThat(method1Param1.getValue()).isEqualsTo("value1");

Как я могу настроить EasyMock / PowerMock для этого executeOnTracerControllerScope выполнить tracerController.startTracer без вызова их внутреннего кода?

1 Ответ

1 голос
/ 24 сентября 2019

tracerController это макет.Так что startTracer не будет вызвано на это.Как определено сейчас, он просто ничего не сделает.Код, выполняющий то, что вы запрашиваете, должен выглядеть примерно так:

Capture<Object> method1Param1 = newCapture();
tracerController.startTracer(capture(method1Param1)); // no need for the expect, it's the default
replay(tracerController);
// ...
tracerService.startTracer("TEST", "value1");
assertThat(method1Param1.getValue()).isEqualsTo("value1");

Конечно, attendStartConditions и executeOnTracerControllerScope будут вызываться по-настоящему.

Если после вашего комментария выхотите издеваться executeOnTracerControllerScope, вы будете делать код ниже.Тем не менее, ваша лямбда больше не будет называться.Таким образом, вы не сможете проверить параметр.

public class MyTest {
    @Test
    public void test() {
        TracerController tracerController = mock(TracerController.class);
        TracerService service = partialMockBuilder(TracerService.class)
                .withConstructor(tracerController)
                .addMockedMethod("executeOnTracerControllerScope")
                .mock();
        replay(tracerController);

        service.startTracer("tracer", "param");
    }
}

class TracerService {

    private final TracerController tracerController;

    public TracerService(TracerController tracerController) {
        this.tracerController = tracerController;
    }

    public boolean attendStartConditions(String tracerName, Object param1) {
        return true;
    }

    public void executeOnTracerControllerScope(Consumer<TracerController> tracer) {
        tracer.accept(tracerController);
    }

    public void startTracer(String tracerName, Object param1) {
        if (attendStartConditions(tracerName, param1)) {
            executeOnTracerControllerScope(tracerController -> tracerController.startTracer(param1));
        }
    }

}

interface TracerController {
    void startTracer(Object param1);
}
...