我有以下界面:

public interface Test{
    public void block(String modifier);
    public boolean blocked(String modifier);
}


所以我想模拟这个接口,如下所示:

Test m = Mockito.mock(Test.class);
when(m.blocked(Mockito.any()).thenReturn(true);
//I want to mock m.block()


我想模拟Test::block(String)的方式,所以当在某些String someString上调用它时,它会更改行为,以便m.blocked(someString)返回false

在Mockito中可以这样做吗?

最佳答案

调用方法时,可以使用thenAnswerdoAnswer执行任意代码。例如,您可以使用Set跟踪已被阻止的字符串:

Set<Object> blocked = new HashSet<>();
Test m = mock(Test.class);
doAnswer(invocation -> blocked.add(invocation.getArguments()[0]))
    .when(m).block(any());
when(m.blocked(any()))
    .thenAnswer(invocation -> !blocked.contains(invocation.getArguments()[0]));

08-18 17:56