差異處
這裏顯示兩個版本的差異處。
java:junit:powermockito:code_coverage_with_powermock_on_static_method [2020/04/25 18:53] tony [Reference] |
java:junit:powermockito:code_coverage_with_powermock_on_static_method [2023/06/25 09:48] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | {{tag>java powermock}} | ||
- | ====== Code Coverage With PowerMock on static method ====== | ||
- | ===== Problem ===== | ||
- | PowerMock最強大的地方,就是可以幫我們mock static method,還可以幫我們mock private method、constructor,甚至System的[[java:junit:powermockito:mockpartial|link]]。開發新功能無法避免使用到舊有的程式碼,而舊有的程式碼勢必有使用static method的utility class。本篇文章將分享如何撰寫測試,讓你可以正常的看到SUT(software under test)程式碼的coverage。 | ||
- | ===== How to? ===== | ||
- | 以下是本篇文章範例的類別圖:\\ | ||
- | {{:java:junit:powermockito:powermockito_mock_static_method.png|}}\\ | ||
- | SUT提供testMethod功能,會使用DOC(Depended-on Component)所提供的static method delegatedMethod。接下來我將使用PowerMockito去mock DOC static的行為: | ||
- | <code java> | ||
- | @RunWith(PowerMockRunner.class) | ||
- | @PrepareForTest({DOC.class}) | ||
- | public class SUTTest { | ||
- | @Test | ||
- | public void shouldReturnMockData_WhenDelegateExecutionToStaticMockDOC() { | ||
- | // Given | ||
- | String expectData = "MockData"; | ||
- | mockStatic(DOC.class); | ||
- | doReturn(expectData).when(DOC.class); | ||
- | DOC.delegatedMethod(); | ||
- | |||
- | // When | ||
- | SUT sut = new SUT(); | ||
- | String realData = sut.testMethod(); | ||
- | |||
- | // Then | ||
- | assertEquals(expectData, realData); | ||
- | } | ||
- | } | ||
- | </code> | ||
- | 接下來我們使用JUnit+code coverage tool去跑測試,以下為執行結果:\\ | ||
- | {{:java:junit:powermockito:powermockito_mock_static_method_sut_coverage.png|}}\\ | ||
- | 由此可見,mock "一般"的static method並不會造成coverage問題。但為什麼會有人對coverage問題抱持疑問呢? 答案是因為誤把SUT加到了@PrepareForTest之中: | ||
- | <code java> | ||
- | @RunWith(PowerMockRunner.class) | ||
- | @PrepareForTest({SUT.class, DOC.class}) | ||
- | public class SUTTest { | ||
- | ... | ||
- | </code> | ||
- | |||
- | 什麼時候會需要將SUT加入@PrepareForTest之中呢? 答案是如果你要Mock SUT裡面行為或者是Java System classes(如java.lang.*的class)的行為。 | ||
- | - Mock SUT裡面的行為代表你的SUT沒設計好,請重新想想你的設計。 | ||
- | - 面對Mock Java System classes的情況,如果你想要能夠正常看到coverage,不妨使用wrapper class去包裝使用到的物件。根據這篇[[https://github.com/powermock/powermock/wiki/Code-coverage-with-JaCoCo|文章]],目前沒有一個很容易讓你使用powermock又可以正常使用coverage tool的方法,至少我還沒成功過。 | ||
- | |||
- | ===== Reference ===== | ||
- | * [[https://github.com/powermock/powermock/wiki/Mock-System|Mock-System]] | ||
- | * [[https://github.com/powermock/powermock/wiki/Code-coverage-with-JaCoCo|Code Coverage with JaCoCo]] | ||
- | |||
- | ===== ===== | ||
- | ---- | ||
- | \\ | ||
- | ~~DISQUS~~ |