[英]Unit testing method which is using a private field initialized with static method
在我的 class TwitchService
,我使用TwitchClientBuilder
twitchClient
我怎樣才能接近使用twitchClient
的測試方法sendChatMessage()
?
public class TwitchService {
public TwitchService(){
twitchClient = TwitchClientBuilder.builder().build();
}
public void sendChatMessage(String content) throws Exception {
if(content.isEmpty()){
throw new Exception("Cannot send empty message!");
}
twitchClient.getChat().sendMessage(content);
}
}
到目前為止,我已經像這樣嘗試了 mocking TwitchClientBuilder.builder()
和twitchCliendBuilder.build()
:
@RunWith(MockitoJUnitRunner.class)
public class TwitchServiceTest {
private TwitchService twitchService;
@Mock
private TwitchClientBuilder twitchClientBuilder;
@Test
public void sendChatMessage() throws Exception {
try (MockedStatic<TwitchClientBuilder> twitchClientBuilderMockedStatic = Mockito.mockStatic(TwitchClientBuilder.class)){
twitchClientBuilderMockedStatic.when(() -> TwitchClientBuilder.builder()).thenReturn(mock(TwitchClientBuilder.class));
when(twitchClientBuilder.build()).thenReturn(mock(TwitchClient.class));
twitchService = new TwitchService("x", "y");
twitchService.sendChatMessage("test message");
}
}
}
但是我在sendChatMessage()
的twitchClient
上得到NullPointerException
任何想法如何正確模擬這樣的字段?
為TwitchClient
使用構造函數依賴注入,而不是通過調用 builder 對其進行硬編碼。
只需重新編寫您的服務,就像這樣:
public class TwitchService {
private final TwitchClient twitchClient
public TwitchService(final TwitchClient twitchClient) {
this.twitchClient = twitchClient;
}
...
}
TwitchService
現在與TwitchClient
的實現松散耦合,這使您能夠在單元測試中模擬客戶端並在實際代碼中使用實際實現(單元測試本身)。
所以在單元測試中,我們可以模擬TwitchClient
:
@RunWith(MockitoJUnitRunner.class)
public class TwitchServiceTest {
@Mock
private TwitchClient mockedTwitchClient;
// Tested instance
private TwitchService twitchService;
@Before
public void before() {
twitchService = new TwitchService(mockedTwitchClient);
}
@Test
public void ourTest() {
when(mockedTwitchClient.xyz()).thenReturn(...);
...
}
在真實代碼中,我們“注入”了由TwitchClient
構建的真實TwitchClientBuilder
:
...
twitchService = new TwitchService(TwitchClientBuilder.builder().build());
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.