在SpringMVC/SpringBoot 的項目中,雖然Service層的測試通過Mockito可以涵蓋絕大部分的場景例驹,但是還是有少數(shù)的場景需要用到Powermock捐韩。 本文記錄一下在Spring中引入Powermock時候遇到的一些坑。
PowerMockRunner vs PowerMockRule
在一開始鹃锈,考慮到Sping 的用例都需要SpringJUnit4ClassRunner作為運行器荤胁,所以考慮用PowerMockRule來規(guī)避需要兩個Runner的問題
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(location= "classpath:root-context.xml" })
@PrepareForTest({ StaticClass.class })
public class MyTestClass{
@Rule
public PowerMockRule rule = new PowerMockRule();
@Before
public void setup() {
PowerMockito.mockStatic(StaticClass.class);
}
}
結果發(fā)現(xiàn),SpringJUnit4ClassRunner 和PowerMockRule 存在沖突屎债。
https://groups.google.com/forum/%23!msg/powermock/bmH8osYhsbQ/gT4-J32T5QkJ
在參考了一下的帖子后這部分問題解決了
https://stackoverflow.com/questions/34147060/cannot-run-powermockrule-with-springjunit4classrunner-in-spring-boot-project
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(location= "classpath:root-context.xml" })
@PrepareForTest({ StaticClass.class })
public class MyTestClass{
@Before
public void setup() {
PowerMockito.mockStatic(StaticClass.class);
}
}
PowerMockIgnore
在使用上述配置后仅政,依舊存在關于classloader相關的報錯。經(jīng)查詢后盆驹,發(fā)現(xiàn)有如下的問題
https://github.com/powermock/powermock/issues/735
需要根據(jù)報錯情況圆丹,把有沖突的類給ignore掉。如下案例:
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PowerMockIgnore(value= "javax.net.ssl.*","javax.net.SocketFactory"})
ContextConfiguration
在上述操作完成后躯喇,發(fā)現(xiàn)在Context的load過程中辫封,首先由于該系統(tǒng)依賴各種中間件、數(shù)據(jù)庫等第三方應用玖瘸,耗時超過10s才能把容器中的各項應用load完成秸讹。另外一方面,由于應用的用戶鑒權雅倒、連接失敗等原因璃诀,導致applicationContext啟動失敗。
因此蔑匣,只有通過ContextConfiguration將本次測試所需要的class導入進來劣欢。
這樣做的好處是速度快,時間:1s VS (10-30)s
問題在于裁良,由于每個被測對象所依賴的class各不相同凿将,所以需要為每個測試類加上所需要的依賴。