使用mockito;是否可以模拟一个接受lambda作为参数并Assertlambda捕获的变量的方法?

ffscu2ro  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(130)

我有一个方法,看起来像这样:

public Response methodA(ParamObject po, Supplier<Response> supplier)

字符串
Supplier包含对另一个类的方法的调用。
我试图在Supplier中 Package 一些代码,使用一组更复杂的逻辑,类似于策略模式,它确实使代码更容易理解。
它看起来像:

public Controller {    
   private Helper helper;
   private Delegate delegate;

   public void doSomething() {
     ParamObject po = ....
     delegate.methodA(po, () -> {
         helper.doSomethingElse(v1, v2);
     }
   }

}


在我对Controller的测试中,我模拟了HelperDelegate,我希望验证helper.doSomething是用正确的参数值调用的,然后返回一个模拟的响应。
由于delegate是一个mock,Supplier实际上从未执行过,因此对helper的调用的验证无法被mock或验证。
有可能做到这一点吗?感觉我应该能够告诉mockito捕获lambda,和/或lambda本身捕获的变量,并Assert它们是正确的值,如果它们是我正在寻找的值,则返回我的mock响应。

ki1q1bka

ki1q1bka1#

假设你的类助手看起来像这样:

public class Helper {
    public Response doSomethingElse(String v1, String v2) {
        // rest of the method here
    }
}

字符串
然后可以这样做:

Helper helper = mock(Helper.class);
// a and b are the expected parameters
when(helper.doSomethingElse("a", "b")).thenReturn(new Response());
// a and c are not the expected parameters
when(helper.doSomethingElse("a", "c")).thenThrow(new AssertionError());

Delegate delegate = mock(Delegate.class);
// Whatever the parameters provided, simply execute the supplier to 
// get the response to provide and to get an AssertionError if the
// parameters are not the expected ones
when(delegate.methodA(any(), any())).then(
    new Answer<Response>() {
        @Override
        public Response answer(final InvocationOnMock invocationOnMock) throws Throwable {
            return ((Supplier<Response>) invocationOnMock.getArguments()[1]).get();
        }
    }
);

Controller controller = new Controller();
controller.helper = helper;
controller.delegate = delegate;
controller.doSomething();

9avjhtql

9avjhtql2#

有了lamda函数,你还可以让它看起来更漂亮、更紧凑--这是另一个很好的答案。

final Delegate delegate = mock(Delegate.class);
when(delegate.methodA(any(), any(Supplier.class))).then(
    (invocationOnMock) -> ((Supplier) invocationOnMock.getArguments()[1]).get()
);

字符串

相关问题