2016-12-12 103 views
1

我正在使用JIRA's REST Client的J2EE項目。 此客戶端返回Jira issue對象。 Issue類的一些字段是key,self,id,summary等等 這裏的self字段基本上是一個URI。
例如http://jira.company.com/rest/api/2.0/issue/12345 我有一個用例,我必須從上面指定的URI檢索主機。如何使用Mockito單元測試鏈式方法調用

我可以通過像issue.getSelf().getHost()這樣的事情做到這一點。
issue.getSelf()返回類型'URI'的對象並獲取主機我可以簡單地使用URI類提供的getHost()方法,該方法以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); 
    } 

在這裏,我得到一個Null Pointer Exception

經過大量研究後,我才知道我將不得不使用@Mock(answer = Answers.RETURNS_DEEP_STUBS) private com.atlassian.jira.rest.client.api.domain.Issue mockIssue;
但這也給我一個Null Pointer Exception

有人能告訴我如何模擬鏈式方法調用。

+0

你能用實際的代碼和測試代碼創建一個http://stackoverflow.com/help/mcve嗎?好。 – StackFlowed

+0

@StackFlowed,你很明白,我已經添加到描述中的代碼片段覆蓋了'M','C'和'V'部分。我不認爲爲了使其可執行而放入所有代碼是絕對必要的。代碼片段足以回答這個問題。我沒有看到爲什麼應該提供任何附加代碼的有效理由(我甚至不會提供)回答我的問題。 –

回答

2

你不需要RETURNS_DEEP_STUBS或任何模擬註釋。你只需要模擬你想要在鏈中返回的所有對象,就像這樣:

@Mock Issue issue; 
@Mock URI uri; 

@Before 
public void setup() { 
    when(uri.getHost()).thenReturn(JIRA_HOST); 
    when(issue.getSelf()).thenReturn(uri); 
} 
+3

太蹩腳了。 Mockito的人應該創建一些@DeepMock。那會很酷。 –

+0

@Downvoter - 有何評論? – nickb