日韩性视频-久久久蜜桃-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单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 少妇色视频 | 久久久久久网址 | 亚洲一区在线电影 | 九久久 | 97在线精品视频 | 黄瓜视频在线免费观看 | 浪浪视频在线观看 | 在线观看中文字幕亚洲 | 狠狠操伊人 | 国产对白刺激视频 | 欧美极品jizzhd欧美爆 | 黄色一级国产 | 自拍愉拍 | 97精品国产97久久久久久春色 | 色婷婷久久一区二区三区麻豆 | 国产搞逼视频 | 三女同志亚洲人狂欢 | 亲切的金子餐桌片段的金子 | 狠狠艹狠狠干 | 18av在线播放 | 亚洲自拍偷拍网 | 特种兵之深入敌后高清全集免费观看 | 五月少妇 | av在线免费观看网站 | 韩日一区二区三区 | 国产精品久久久久久久免费大片 | 精品少妇白浆小泬60P | 丰满人妻一区二区三区四区53 | 天堂在线91 | 国产成人免费av一区二区午夜 | 国产精品亚洲а∨天堂免在线 | 我们的2018在线观看免费高清 | 在线观看成人一区 | xxxwww18| 性av免费| 久久毛片网 | 波多野结衣一二三四区 | 91在线色| 天天爽网站 | 三级视频黄色 | 午夜香蕉视频 | 午夜福利电影一区二区 | 妖精视频在线观看免费 | 99亚洲视频 | 男同av在线观看一区二区三区 | 欧美日韩www | 欧美另类在线观看 | 激情五月婷婷久久 | 欧美a一级片 | 成年人黄国产 | 国产精品欧美性爱 | 亚洲欧美另类综合 | 亚洲av无码一区二区三区dv | 欧美亚洲图片小说 | 天天狠狠 | 国产成人综合亚洲 | 亚洲欧美综合久久 | 天堂av资源在线 | 日本成人在线视频网站 | 啪啪资源| av青青草原 | 91九色在线 | 人人澡人人澡 | 九九在线 | 蜜桃视频中文字幕 | 人妻奶水人妻系列 | 麻豆传媒在线观看视频 | 91黄色免费视频 | 久久精品无码av | 一区二区三区视频免费 | 一级黄色大片在线观看 | 台湾swag在线观看 | 色欲一区二区三区精品a片 在线观看黄网站 | 日日噜| 久久精品国产99精品国产亚洲性色 | 国产日韩一级片 | 大尺度一区二区 | 懂色av蜜臀av粉嫩av分享吧 | 亚洲综合黄色 | av成人免费在线观看 | 亚洲天堂中文字幕在线 | 欧美国产一区二区在线观看 | 干欧美少妇 | 亚洲一线在线观看 | 一级片在线免费 | 日韩成人免费视频 | 日韩av毛片在线观看 | 午夜在线一区 | 日本一二三区视频在线 | 欧美在线一卡 | 国产毛片在线 | 久久精品性爱视频 | 久久综合五月婷婷 | a级片免费观看 | 2021天天操| 欧美人妻精品一区二区免费看 | 奶水喷溅虐奶乳奴h文 | 黄色一级大片在线免费看国产一 | 国产 日韩 欧美 精品 |