簡體   English   中英

使用 static 方法初始化的私有字段的單元測試方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM