如何使用Mockito对链接的方法调用进行单元测试

RIT*_*AVI 6 java junit mockito

我正在研究一个使用JIRA的REST Client的J2EE项目。该客户端返回一个Jira issue对象。一些领域的Issue阶级是keyselfidsummary,等等self领域在这里基本上是一个URI。
例如,http://jira.company.com/rest/api/2.0/issue/12345 我有一个用例,其中我必须从上面指定的URI中检索主机。

我可以用类似的方法做到这一点issue.getSelf().getHost()
issue.getSelf()返回“ URI”类型的对象并获取主机,我可以简单地使用类getHost()提供的方法,URI该类以String格式返回主机URL 。

一切正常。我在使用Mockito进行这段代码的单元测试时遇到问题。我不知道如何模拟链接的方法调用。

我有以下代码片段。

private static final String JIRA_HOST = "jira.company.com";
@Mock private com.atlassian.jira.rest.client.api.domain.Issue mockIssue;

@Before
    public void setup() {
        when(mockIssue.getSelf().getHost()).thenReturn(JIRA_HOST);
    }
Run Code Online (Sandbox Code Playgroud)

在这里,我得到一个Null Pointer Exception

经过大量研究之后,我才知道必须使用@Mock(answer = Answers.RETURNS_DEEP_STUBS) private com.atlassian.jira.rest.client.api.domain.Issue mockIssue;
但这也给我一个启示Null Pointer Exception

有人可以告诉我如何模拟链接的方法调用。

nic*_*ckb 9

您不需要RETURNS_DEEP_STUBS或不需要任何模拟注释。您只需要模拟链中要返回的每个对象,类似于:

@Mock Issue issue;
@Mock URI uri;

@Before
public void setup() {
    when(uri.getHost()).thenReturn(JIRA_HOST);
    when(issue.getSelf()).thenReturn(uri);
}
Run Code Online (Sandbox Code Playgroud)

  • 真是la子 Mockito的家伙应该创建某种@DeepMock。那将会很酷。 (7认同)