Springboot使用PowerMock單元測試

常規(guī)的單元測試只需要引入springboot-test包,其會(huì)帶入junit勋又,mockito-core玄柏,spring-test

<!-- unit test -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

單元測試class如下,如果不需要起spring環(huán)境的話可以不要@SpringBootTest和@RunWith:

@SpringBootTest
@RunWith(SpringRunner.class)
public class ContractServiceTest {
    @Mock
    private IParameterService parameterService;
    @InjectMocks
    @Autowired
    private PriceServiceImpl priceService;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test1() {
        ...
    }
}

如果需要mock靜態(tài)方法兔辅,需要額外引入powerMock:

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.0</version>
    <scope>test</scope>
</dependency>

單元測試class的注解替換為:

@RunWith(PowerMockRunner.class) // 告訴JUnit使用PowerMockRunner進(jìn)行測試
@PrepareForTest({FaccAppConfig.class}) // 所有需要測試的類列在此處腊敲,適用于模擬final類或有final, private, static, native方法的類
@PowerMockIgnore({"javax.*.*", "com.sun.*", "org.xml.*", "org.apache.*"}) //為了解決使用powermock后,提示classloader錯(cuò)誤

如果需要配合springboot來起spring環(huán)境幢妄,注解替換為:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class) //RunWith依然是PowerMock兔仰,那這里Delegate委托給spring
@PowerMockIgnore({"javax.*.*", "com.sun.*", "org.xml.*", "org.apache.*"})
@PrepareForTest({FaccAppConfig.class})
@SpringBootTest

于是可以用PowerMockito來mock靜態(tài)方法,when表達(dá)式依然用的Mockito的api:

PowerMockito.mockStatic(FaccAppConfig.class);
Mockito.when(FaccAppConfig.getProperty(Mockito.anyString())).thenReturn("aaabbbccc");

啟動(dòng)@Test測試方法時(shí)報(bào)錯(cuò)蕉鸳,因?yàn)镻owerMockito版本錯(cuò)誤造成乎赴,從1.7.4升級(jí)到2.0.0即可


圖片.png

運(yùn)行測試方法時(shí),因?yàn)樵摲椒ú恍枰猻pring環(huán)境所以直接執(zhí)行完成潮尝,但順帶啟動(dòng)的spring報(bào)錯(cuò):

Caused by: com.caucho.hessian4.HessianException: jar:file:/D:/work/mavenRepository/com/focustech/serialization-hessian2/1.1.0/serialization-hessian2-1.1.0.jar!/META-INF/serialization/hessian/serializers: com.caucho.hessian4.io.RemoteSerializer is invalid because it does not implement com.caucho.hessian4.io.Serializer
at com.caucho.hessian4.io.ContextSerializerFactory.initSerializerFiles(ContextSerializerFactory.java:344)
at com.caucho.hessian4.io.ContextSerializerFactory.init(ContextSerializerFactory.java:261)
at com.caucho.hessian4.io.ContextSerializerFactory.<init>(ContextSerializerFactory.java:105)
at com.caucho.hessian4.io.ContextSerializerFactory.create(ContextSerializerFactory.java:127)
at com.caucho.hessian4.io.ContextSerializerFactory.create(ContextSerializerFactory.java:125)
at com.caucho.hessian4.io.ContextSerializerFactory.create(ContextSerializerFactory.java:125)
at com.caucho.hessian4.io.ContextSerializerFactory.create(ContextSerializerFactory.java:125)
at com.caucho.hessian4.io.SerializerFactory.<init>(SerializerFactory.java:109)
at com.caucho.hessian4.io.SerializerFactory.<init>(SerializerFactory.java:102)
at com.focus.candy.rpc.protocol.serialization.HessianSerialization.<clinit>(HessianSerialization.java:29)

錯(cuò)誤里提到hessian2在META-INF下的配置文件serializers榕吼,文件配置的實(shí)現(xiàn)類和Serializer接口對應(yīng)不上。就是說SPI機(jī)制沒對應(yīng)上勉失,在啟動(dòng)過程中debug關(guān)鍵代碼:


圖片.png

圖片.png

圖片.png

發(fā)現(xiàn)Serializer接口被PowerMock的JavassistMockClassLoader加載羹蚣,實(shí)現(xiàn)類被標(biāo)準(zhǔn)的AppClassLoader加載,所以無法對應(yīng)上乱凿。
想起來需要排除PowerMock盡量不讓加載公共類顽素,在@PowerMockIgnore添上hessian的路徑"com.caucho.*"即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徒蟆,一起剝皮案震驚了整個(gè)濱河市胁出,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌段审,老刑警劉巖全蝶,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寺枉,居然都是意外死亡抑淫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門姥闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來始苇,“玉大人,你說我怎么就攤上這事筐喳」∪铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵疏唾,是天一觀的道長。 經(jīng)常有香客問我函似,道長槐脏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任撇寞,我火速辦了婚禮顿天,結(jié)果婚禮上堂氯,老公的妹妹穿的比我還像新娘。我一直安慰自己牌废,他們只是感情好咽白,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸟缕,像睡著了一般晶框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂从,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天授段,我揣著相機(jī)與錄音,去河邊找鬼番甩。 笑死侵贵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缘薛。 我是一名探鬼主播窍育,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宴胧!你這毒婦竟也來了漱抓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤牺汤,失蹤者是張志新(化名)和其女友劉穎辽旋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐迟,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡补胚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了追迟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溶其。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖敦间,靈堂內(nèi)的尸體忽然破棺而出瓶逃,到底是詐尸還是另有隱情,我是刑警寧澤廓块,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布厢绝,位于F島的核電站,受9級(jí)特大地震影響带猴,放射性物質(zhì)發(fā)生泄漏昔汉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一拴清、第九天 我趴在偏房一處隱蔽的房頂上張望靶病。 院中可真熱鬧会通,春花似錦、人聲如沸娄周。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煤辨。三九已至裳涛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掷酗,已是汗流浹背调违。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泻轰,地道東北人技肩。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像浮声,于是被迫代替她去往敵國和親虚婿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355