我有以下界面:
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()
Buty我想模仿Test::block(String)
的方式,所以当在某些String someString
上调用它时,它会更改行为,以便m.blocked(someString)
返回false
。
Mockito可以这样做吗?
答案 0 :(得分:2)
在调用方法时,您可以使用thenAnswer
和doAnswer
执行任意代码。例如,您可以使用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]));
答案 1 :(得分:1)
这是一个示例,假设您有一个以true开头的布尔字段 -
when(m.blocked(Mockito.any()).thenAnswer(invocation -> this.mockValue);
when(m.block(Mockito.eq("Some String")).thenAnswer(invocation -> {
this.mockValue = false;
return null;
});
希望我没有弄错语法: - )