日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

一文彻底理解Java单元测试

發布時間:2025/4/16 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文彻底理解Java单元测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Junit4

說起Java中的單元測試,我覺得大家首先想到的應該是Junit,比如下面這樣的一個類和方法:

public class Calculator {public int evaluate(String expression) {int sum = 0;for (String summand: expression.split("\\+"))sum += Integer.valueOf(summand);return sum;} } 復制代碼

我們可以編寫一個測試類 CalculatorTest.java,來對方法Calculator.evaluate((String expression)進行單元測試:

public class CalculatorTest {@Testpublic void evaluatesExpression() {Calculator calculator = new Calculator();int sum = calculator.evaluate("1+2+3");Assert.assertEquals(6, sum);} } 復制代碼

代碼如上,可以看到,使用一個注解 @Test和斷言語句Assert.assertEquals(6, sum);,便完成了一個單元測試的編寫。

Test runners

一些常見的IDE都提供了對Junit的支持,可以直接在界面進行測試,無需我們自己去控制臺run這些程序。
Junit默認的runner是:BlockJUnit4ClassRunner,可以使用@RunWith注解來指定runner,比如后續我們需要用到的SpringJUnit4ClassRunner。

Assertions

上述例子中,要驗證Calculator.evaluate的正確性,我們使用到了斷言語句 Assert.assertEquals(6, sum);,在平常的單元測試中,我們都需要編寫大量的斷言語句。對于所有的基本類型,Junit都提供了斷言方法,就像下面這樣:

public class AssertTests {@Testpublic void testAssertNull() {assertNull("should be null", null);}@Testpublic void testAssertTrue() {assertTrue("failure - should be true", true);} } 復制代碼

Spring與Junit

在spring中,Spring TestContext Framework提供了對Junit的支持,通過使用@RunWith(SpringJUnit4ClassRunner.class)或@RunWith(SpringRunner.class)注解,我們便能實現一個標準的Junit測試,并且能獲取到Spring TestContext framework的支持,比如獲取spring context、事務管理、依賴注入等等。

@ContextConfiguration

@ContextConfiguration用來加載和配置一個ApplicationContext,可以用指定xml的方式,也可以指定一個config class:

@ContextConfiguration("/test-config.xml") public class XmlApplicationContextTests {// class body... } @ContextConfiguration(classes = TestConfig.class) public class ConfigClassApplicationContextTests {// class body... } 復制代碼

即使用@RunWith(SpringRunner.class)和@ContextConfiguration,就可以起一個spring的環境并進行測試了,如下:

@RunWith(SpringRunner.class) @ContextConfiguration(classes = CalculatorTest.TestConfig.class) public class CalculatorTest {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void application() {Assert.assertNotNull(applicationContext);Assert.assertNotNull(applicationContext.getBean("testBean"));}@Configurationpublic static class TestConfig {@Beanpublic Object testBean() {return new Object();}} } 復制代碼

Mock

在真實的測試場景中,一個類往往會引用一個至多個bean,這些bean往往又會引用其他的bean,如果想在配置文件或類中配置完所有的bean,發現會越寫越多,最后可能需要一份全量的bean配置了。

public abstract class AbstractSplitPkgStrategy extends AbstractCostSplitStrategy {@Resourceprivate ISelfScItemAtomService selfScItemAtomService;@Resourceprivate GoodsCenterService goodsCenterService;@Resourceprivate CostItemSplitMapper costItemSplitMapper;@Resourceprivate SplitPkgByPcsMetaGenerateStrategy pcsStrategy;@Resourceprivate LstPackageReadService lstPackageReadService;@Resourceprivate TairManager commonTairManager;//方法... } 復制代碼

比如上面是我們要進行測試的一個類,當我嘗試在xml或者config中配置它引用的bean的時候,我發現這些bean又引入了其他bean,然后得需要一層一層往下寫配置。

Mockito

針對上述問題,我們可以使用Mockito來mock掉我們需要的bean。mock的配置也有多種方式,如下是兩種配置方式:
使用xml進行配置:

//xml配置 <bean id="calculator" class="org.mockito.Mockito" factory-method="mock"><constructor-arg value="com.zuqiang.junit.Calculator"/> </bean> //test @RunWith(SpringRunner.class) @ContextConfiguration("/context.xml") public class CalculatorTest {@Autowiredprivate Calculator Calculator;@Testpublic void application() {Assert.assertNotNull(Calculator);} }復制代碼

使用config class:

@RunWith(SpringRunner.class) @ContextConfiguration(classes = CalculatorTest.MockConfig.class) public class CalculatorTest {@Autowiredprivate Calculator calculator;@Testpublic void application() {Assert.assertNotNull(calculator);}@Configurationpublic static class MockConfig{@Beanpublic Calculator calculator() {return Mockito.mock(Calculator.class);}} } 復制代碼

mock的使用:

@RunWith(SpringRunner.class) @ContextConfiguration(classes = CalculatorTest.MockConfig.class) public class CalculatorTest {@Autowiredprivate Calculator calculator;@Beforepublic void before() {Mockito.when(calculator.evaluate(Mockito.anyString())).thenReturn(1);}@Testpublic void application() {Assert.assertEquals(1,calculator.evaluate("1+2"));Assert.assertEquals(1,calculator.evaluate("2+2"));}@Configurationpublic static class MockConfig {@Beanpublic Calculator calculator() {return Mockito.mock(Calculator.class);}} } 復制代碼

斷言

在上面,我們已經看到了Junit提供的斷言方法,對于一些簡單的場景,我覺得沒有什么問題。但是在一些復雜的場景下,可能會導致代碼晦澀難懂。所以最后給大家介紹一個更好用的Java斷言框架— AssertJ。
比如下面這個比較簡單的test:

@Testpublic void test() throws Exception {//ArrangeList<String> strings = Lists.newArrayList("a","b","c");//ActString removedString = strings.remove(0);//AssertassertThat(strings, containsInAnyOrder("b", "c"));} 復制代碼

用AssertJ之后的寫法像下面這樣:

@Testpublic void test() throws Exception {//ArrangeList<String> strings = Lists.newArrayList("a","b","c");//ActString removedString = strings.remove(0);//AssertassertThat(strings).contains("b", "c");復制代碼



總結

以上是生活随笔為你收集整理的一文彻底理解Java单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91成人入口 | 国产精品中文 | 六月婷婷综合 | 精品中文字幕一区二区 | 国产精品久久在线观看 | 双性人hdsexvideos | 亚洲精品成人在线 | 国产视频一区二区视频 | 蜜色影院 | www.欧美色图 | 欧美一区二区三区小说 | 97精品人妻一区二区 | 一级免费在线 | 久久艹这里只有精品 | 亚洲一区二区国产 | 高清视频免费在线观看 | 日韩羞羞 | 国产在线国偷精品免费看 | 国产毛片av | 青娱乐在线免费视频 | 最新天堂在线视频 | 美味的客房沙龙服务 | 特级大胆西西4444人体 | 一级作爱视频 | 国产少妇一区二区 | 一区二区三区欧美 | 蜜桃av影院 | 国产大学生视频 | 一级黄色片免费在线观看 | 伦伦影院午夜理伦片 | 素人av在线 | 国产欧美在线视频 | 国产三级av片| 狠狠狠狠狠干 | 伊人久久久久久久久久 | 人人干狠狠干 | 国产中文久久 | 欧美三级免费观看 | 脱女学生小内内摸了高潮 | 91麻豆精品在线 | 在线观看成年人视频 | 欧美第一页草草影院 | 亚洲男人天堂影院 | 黄色成人免费网站 | 后进极品白嫩翘臀在线视频 | 本道久久 | 成人无码久久久久毛片 | wwyoujizzcom| 久久综合社区 | 中国a一片一级一片 | 91在线视频导航 | 亚洲精品二 | 992tv成人免费视频 | 91欧美国产 | 欧美日韩一区二区综合 | 金8天国av | 亚洲国产精品女人久久久 | 激情爱爱网站 | 在线精品小视频 | 男人av网| 奇米影视四色7777 | 亚洲综合免费观看高清完整版在线 | 中文字幕亚洲激情 | 开心激情av | 国语对白一区二区 | 女同动漫免费观看高清完整版在线观看 | 黑人欧美一区二区三区 | 亚洲 欧美 日韩系列 | 成人网在线看 | 97精品国产97久久久久久春色 | 黄色网页免费看 | 视频在线免费观看 | 欧美日韩在线影院 | 日本精品区 | 日韩中文字幕2019 | a亚洲天堂 | 久久久久久久久久久久久久久久久久久久 | 男女乱淫视频 | 少妇做爰免费视频播放 | 毛片3| 四季av一区二区三区免费观看 | 成人h视频在线观看 | 中文字幕日韩国产 | 亚洲黄色片在线观看 | av不卡中文字幕 | 少妇日皮视频 | 奇米超碰在线 | 亚洲精品h | 日韩久久精品一区二区 | 不卡影院一区二区 | 欧美另类69| 欧美精品一区二区蜜臀亚洲 | 九九影视理伦片 | 日韩伦理av | 久久午夜精品视频 | www.呦呦| 国产极品美女高潮无套在线观看 | 91玖玖| 久久中文免费视频 |