前言
這事吧,也就是我最近接團(tuán)隊(duì)代碼然后調(diào)整代碼碰見(jiàn)的。經(jīng)過(guò)分析,我需要在我的公共core包里面添加代碼模塊。但是,如果編寫(xiě)好直接用項(xiàng)目來(lái)測(cè)試,可能我需要經(jīng)常變動(dòng)我的jar包的版本號(hào),為了避免麻煩,我決定在我的core包里寫(xiě)單元測(cè)試,調(diào)試好了以后再聯(lián)調(diào),結(jié)果就迎來(lái)了更多的麻煩。不過(guò),我覺(jué)得我沒(méi)有最終搞通它的原理,只是這樣做可搞通,先記下來(lái)吧,至少能解決問(wèn)題。
依賴(lài)
我的項(xiàng)目是基于springboot2.0的,所以網(wǎng)上會(huì)找到一些相對(duì)比較久的資料。我們這里澄清下,直接引入配套的starter即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
這個(gè)依賴(lài)的版本是和你的springboot的版本一致的。
文件準(zhǔn)備
我建立了這樣一些文件:
- 測(cè)試類(lèi):這個(gè)類(lèi)和被測(cè)試類(lèi)放在了一個(gè)包里,只不過(guò)這里是放在了test文件夾的下面。
- application.yml:由于我這個(gè)項(xiàng)目是個(gè)jar包,主項(xiàng)目里既沒(méi)有啟動(dòng)類(lèi)也沒(méi)有配置文件,所以我們需要在這里添加配置文件。記得,需要把這個(gè)文件夾設(shè)置為測(cè)試文件夾,一般來(lái)說(shuō),我們要把它放在test下面的resources里面。默認(rèn)是沒(méi)有這個(gè)文件夾的,需要自己創(chuàng)建
- 配置類(lèi):我的麻煩也是因此而起的。被測(cè)試代碼中需要使用redis,而我的redis的使用是需要配置bean然后使用我自定義的上下文來(lái)使用的,后面我們會(huì)詳細(xì)說(shuō)這里的坑。
使用
先說(shuō)正確的結(jié)果吧,下面是我的測(cè)試類(lèi),基本關(guān)鍵的內(nèi)容都在這里面:
@RunWith(SpringRunner.class)
@SpringBootTest(classes=TestApplication.class)
@Import(RedisConfiguration.class)
public class CycleNumTest implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
YmContext.initialContext(applicationContext);
}
@Test
public void testSetCycleNum(){
CycleNumManager.getManager().setCycleNum("testCycleNum", Long.valueOf(Short.MAX_VALUE));
}
}
下面我們根據(jù)這里的代碼來(lái)吧整體的邏輯和坑串一遍:
- @RunWith(SpringRunner.class):我們需要指定使用SpringRunner來(lái)運(yùn)行。這個(gè)類(lèi)如果你只添加Junit是沒(méi)有的,所以要使用starter,避免為相關(guān)的依賴(lài)煩心。
- @SpringBootTest(classes=TestApplication.class):先說(shuō)這個(gè)注解,有了它,我們就可以在運(yùn)行單元測(cè)試的時(shí)候啟動(dòng)一個(gè)springboot實(shí)例。看到我里面指明了一個(gè)application類(lèi),但我前面又沒(méi)有說(shuō)它。因?yàn)檫@個(gè)指定是無(wú)效的,我可以確定他沒(méi)有使用TestApplication里面我寫(xiě)的代碼來(lái)運(yùn)行而是自己?jiǎn)?dòng)了一個(gè)默認(rèn)的。一切問(wèn)題,也是因此而起。
- ApplicationContextAware 接口實(shí)現(xiàn):這是我解決我的問(wèn)題的方法??梢钥吹剑趕etApplicationContext方法里面,我把a(bǔ)pplicationContext賦給了YmContext,這其實(shí)是在完成我的體系里面的上下文的初始化,而我推薦的方法在這里并無(wú)法完成,只能以此為替代。
- testSetCycleNum:這個(gè)沒(méi)什么好說(shuō)的了,具體的測(cè)試類(lèi),記得使用@Test注解。
備注
基本記錄于此,有相關(guān)的內(nèi)容的話,還會(huì)更新該貼。