如何使用EasyMock和PowerMock模拟消费者参数

如何使用EasyMock和PowerMock模拟消费者参数,powermock,easymock,Powermock,Easymock,我有一个测试场景,需要模拟一个使用者参数 在以下代码中,startTracer是要测试的方法 类跟踪服务{ 专用跟踪控制器; public void startTracer(字符串tracerName,对象参数1){ if(AttentStartConditions(tracerName,param1)){ ExecuteonCtracerControllerScope(tracerController->tracerController.startTracer(param1)); } } ..

我有一个测试场景,需要模拟一个使用者参数

在以下代码中,
startTracer
是要测试的方法

类跟踪服务{
专用跟踪控制器;
public void startTracer(字符串tracerName,对象参数1){
if(AttentStartConditions(tracerName,param1)){
ExecuteonCtracerControllerScope(tracerController->tracerController.startTracer(param1));
}
}
...
}
基本上,我想测试tracerController.startTracer(param1)是否将
param1
作为参数接收

Capture method1Param1=newCapture();
tracerController.startTracer(捕获(方法1参数1));
expectLastCall().once();
...
tracerService.startTracer(“测试”、“值1”);
资产(method1Param1.getValue()).isEqualsTo(“value1”);

如何为该
executeOnTracerControllerScope
execute
tracerController.startTracer
配置EasyMock/PowerMock,而无需调用其内部代码?

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

好的,但除此之外,假设我不想从TracerService创建一个部分模拟(以测试
startTrace
方法)。在这种情况下,有一些方法可以模拟方法
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);
}