前言
這事吧锁施,也就是我最近接團(tuán)隊代碼然后調(diào)整代碼碰見的淮悼。經(jīng)過分析咐低,我需要在我的公共core包里面添加代碼模塊。但是袜腥,如果編寫好直接用項目來測試见擦,可能我需要經(jīng)常變動我的jar包的版本號,為了避免麻煩羹令,我決定在我的core包里寫單元測試鲤屡,調(diào)試好了以后再聯(lián)調(diào),結(jié)果就迎來了更多的麻煩福侈。不過酒来,我覺得我沒有最終搞通它的原理,只是這樣做可搞通肪凛,先記下來吧堰汉,至少能解決問題辽社。
依賴
我的項目是基于springboot2.0的,所以網(wǎng)上會找到一些相對比較久的資料翘鸭。我們這里澄清下滴铅,直接引入配套的starter即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
這個依賴的版本是和你的springboot的版本一致的。
文件準(zhǔn)備
我建立了這樣一些文件:
- 測試類:這個類和被測試類放在了一個包里就乓,只不過這里是放在了test文件夾的下面汉匙。
- application.yml:由于我這個項目是個jar包,主項目里既沒有啟動類也沒有配置文件生蚁,所以我們需要在這里添加配置文件噩翠。記得,需要把這個文件夾設(shè)置為測試文件夾邦投,一般來說绎秒,我們要把它放在test下面的resources里面。默認(rèn)是沒有這個文件夾的尼摹,需要自己創(chuàng)建
- 配置類:我的麻煩也是因此而起的。被測試代碼中需要使用redis剂娄,而我的redis的使用是需要配置bean然后使用我自定義的上下文來使用的蠢涝,后面我們會詳細(xì)說這里的坑。
使用
先說正確的結(jié)果吧阅懦,下面是我的測試類和二,基本關(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ù)這里的代碼來吧整體的邏輯和坑串一遍:
- @RunWith(SpringRunner.class):我們需要指定使用SpringRunner來運行。這個類如果你只添加Junit是沒有的耳胎,所以要使用starter惯吕,避免為相關(guān)的依賴煩心。
- @SpringBootTest(classes=TestApplication.class):先說這個注解怕午,有了它废登,我們就可以在運行單元測試的時候啟動一個springboot實例∮粝В看到我里面指明了一個application類堡距,但我前面又沒有說它。因為這個指定是無效的兆蕉,我可以確定他沒有使用TestApplication里面我寫的代碼來運行而是自己啟動了一個默認(rèn)的羽戒。一切問題,也是因此而起虎韵。
- ApplicationContextAware 接口實現(xiàn):這是我解決我的問題的方法易稠。可以看到包蓝,在setApplicationContext方法里面驶社,我把applicationContext賦給了YmContext企量,這其實是在完成我的體系里面的上下文的初始化,而我推薦的方法在這里并無法完成衬吆,只能以此為替代梁钾。
- testSetCycleNum:這個沒什么好說的了,具體的測試類逊抡,記得使用@Test注解姆泻。
備注
基本記錄于此,有相關(guān)的內(nèi)容的話冒嫡,還會更新該貼拇勃。