对于给定的:
@Mock
View view;
我想在调用((View) view.getParent()).getWidth();
时返回,例如400
,但没有嘲笑getParent()
。
与when(((View) view.getParent()).getWidth()).thenReturn(400);
类似(这不起作用)。
我知道它存在(但我找不到)Mockito中允许顺序方法调用的设置。
答案 0 :(得分:1)
您需要将@Mock
更改为@Mock(answer = Answers.RETURNS_DEEP_STUBS)
。没有它,view.getParent()
将始终返回null
。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
View view;
@Test
public void test() {
when(view.getParent().getWidth()).thenReturn(400);
assertThat(view.getParent().getWidth()).isEqualTo(400);
}
}
这是手动创建view.getParent()
调用模拟的快捷方式,即:
View parent = mock(View.class);
when(view.getParent()).thenReturn(parent);
RETURNS_DEEP_STUBS
的
答案 1 :(得分:1)
Mykhailo的回答详细介绍了使用RETURNS_DEEP_STUBS
自动执行此操作的一种方法;你也可以手动完成,这听起来像是你要避免的,但这正是我在你的情况下会做的。
@Mock View view;
@Mock View parent;
when(view.getParent()).thenReturn(parent);
when(parent.getWidth()).thenReturn(400);
正如JB Nizet在评论中所说,你必须模仿父母来完成这项工作。这是因为@Mock View
不是真实视图,因此getParent
将返回null
,除非您以其他方式存根。这意味着您需要存根getParent
以返回真正的400px范围的视图,或者存根getParent
以返回您模拟的父视图,以便getWidth
返回400.(还有一些其他视图选项,例如使用真实视图的@Spy
,但是你的间谍视图会有一个真正的400px宽的父级,你不会遇到这种情况。)