在`when`中的Mockito顺序方法调用

时间:2016-10-29 17:02:59

标签: mockito

对于给定的:

@Mock
View view;

我想在调用((View) view.getParent()).getWidth();时返回,例如400,但没有嘲笑getParent()

when(((View) view.getParent()).getWidth()).thenReturn(400);类似(这不起作用)。

我知道它存在(但我找不到)Mockito中允许顺序方法调用的设置。

2 个答案:

答案 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

Mockito documentation

答案 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宽的父级,你不会遇到这种情况。)