成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Protected方法與單元測試

開發 測試
Protected是一個有趣而有用的修飾符,它把方法的訪問成員嚴格限制在自身或自己的子類身上。本文討論了protected方法的測試和Mock,以及其中需要注意的一些可測試性的方面。

本篇文章討論了protected方法的測試和Mock,以及其中需要注意的一些可測試性的方面。這是一篇簡單的文章,討論了單元測試中遇到protected成員的應對方案。此外,在文章最后也希望和大家討論一下某個特殊的情況下的處理方法。

protected是一個有趣而有用的修飾符,它把方法的訪問成員嚴格限制在自身或自己的子類身上。換句話說,在使用過程中,protected成員對外部是開放的(因為其他類可以通過繼承來使用該成員),又是封閉的(不是自身或子類的一切成員都無法訪問)。而對于單元測試來說,protected成員又是尷尬的,因為它的“開放”意味著我們必須對它進行單元測試,而“封閉”又阻礙了我們在單元測試中涉及protected成員。

測試protected方法

現在有一個類,其中包含一個protected方法:

  1. public class SomeClass  
  2. {  
  3.     protected int SomeMethod(string arg) { ... }  

如果我們需要對這個protected方法進行單元測試,可以在測試代碼中準備一個輔助類型:

  1. public class SomeClassForTest : SomeClass  
  2. {  
  3.     public int PublicSomeMethod(string arg)  
  4.     {  
  5.         return this.SomeMethod(arg);  
  6.     }  

于是在單元測試中,便可以通過調用PublicSomeMethod來測試基類的SomeMethod方法:

  1. var testClass = new SomeClassForTest();  
  2. var result = testClass.PublicSomeMethod(null);  
  3. Assert.Equal(0, result); 

非常簡單。

如果您覺得麻煩,也可以將SomeClass類中的SomeMethod方法改為protected internal,這樣便可以在InternalVisibleTo的測試程序集中使用了。不過,我覺得為單元測試而改變成員的訪問級別不是一個合適的做法。

對protected方法進行Mock

現在有一個類,其中有一個protected方法:

  1. public class SomeClass  
  2. {  
  3.     protected virtual int SomeMethod(string arg) { ... }  

并且,某個被測試的方法接受SomeClass作為參數。雖然被測試的方法不會直接調用SomeMethod方法,但是SomeMethod的實現會影響到公開接口的表現形式。于是,我們需要對SomeMethod進行Mock或Stub。為此,我們同樣需要準備一個輔助類型:

  1. public class MockSomeClass : SomeClass  
  2. {  
  3.     protected override int SomeMethod(string arg)  
  4.     {  
  5.         return this.PublicSomeMethod(arg);  
  6.     }  
  7.  
  8.     public virtual int PublicSomeMethod(string arg)  
  9.     {  
  10.         return base.SomeMethod(arg);  
  11.     }  
  12. }  

在MockSomeClass中,我們覆蓋了基類的SomeMethod實現,使它調用了子類中公開的PublicSomeMethod方法,而PublicSomeMethod內部又調用了基類的SomeMethod方法。因此,如果您不去進行任何處理,那么MockSomeClass會保持SomeMethod的實現不變。而如果您需要對SomeMethod進行Mock或Stub的時候,便可以從PublicSomeMethod下手:

  1. Mock<MockSomeClass> mockSomeClass = new Mock<MockSomeClass>() { CallBase = true };  
  2. mockSomeClass.Setup(c => c.PublicSomeMethod("123")).Returns(123);  
  3.  
  4. DoSomeTest(mockSomeClass.Object); // use the mock object  

也很容易。

為了可測試性

值得注意的是,為了“可測試性”,第二部分中的protected方法必須是virtual的,因為我們需要在子類中進行override。同理,Mock框架能夠輔助的方法也必須是virtual的,即使是一個public方法。那么,您覺得這是為了可測試性而做出的讓步嗎?或者換句話說,您覺得,一個不可以override的protected方法,但是會影響到其他公開接口的功能,這是不是一個合理的設計呢?如果這是一個合理的設計,又不想作出這樣的讓步……我們又該怎么做呢?

本文來自老趙點滴:《與protected成員有關的單元測試方式》

【編輯推薦】

  1. 開發人員最欠缺哪些測試知識?
  2. 編程對軟件測試人員意味著什么?
  3. 使用JBPM工作流引擎測試的一個例子
  4. 軟件測試項目的啟動、規劃與需求分析
  5. 偉大騾子的一生和性能測試
責任編輯:yangsai 來源: 老趙點滴
相關推薦

2017-01-14 23:42:49

單元測試框架軟件測試

2011-05-16 16:52:09

單元測試徹底測試

2009-12-23 15:03:52

WPF單元測試

2023-07-26 08:58:45

Golang單元測試

2011-06-20 17:25:02

單元測試

2024-10-16 16:09:32

2017-02-21 10:30:17

Android單元測試研究與實踐

2017-04-07 13:45:02

PHP單元測試數據庫測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2009-06-02 14:24:32

Hibernate單元測試HSQLDB

2020-08-18 08:10:02

單元測試Java

2017-03-23 16:02:10

Mock技術單元測試

2021-05-05 11:38:40

TestNGPowerMock單元測試

2011-07-04 18:16:42

單元測試

2020-05-07 17:30:49

開發iOS技術

2017-09-13 15:05:10

React前端單元測試

2017-09-10 17:41:39

React全家桶單元測試前端測試

2020-07-07 07:33:12

Java單元集成

2017-02-23 15:59:53

測試MockSetup
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩久久久 | 精品欧美一区免费观看α√ | 国产人久久人人人人爽 | 国产在线不卡视频 | 黄色一级大片在线免费看产 | 欧美一区二区三区在线播放 | 久久久精品一区二区三区 | 欧美精品在线播放 | 国产女人第一次做爰毛片 | 亚洲 欧美 激情 另类 校园 | 国产精品久久久久久久一区二区 | 黄色欧美视频 | 国产伦精品一区二区三区四区视频 | 日韩在线观看一区 | www.日韩在线 | 亚洲一区二区三区在线 | 日韩 国产 在线 | 亚洲精品免费在线观看 | 剑来高清在线观看 | 国产日日操 | 亚洲成人免费视频在线 | 欧美一二精品 | 神马久久久久久久久久 | 日韩欧美手机在线 | 国产精品一区二区三区四区 | 国产成都精品91一区二区三 | 国家一级黄色片 | 欧美精品在线视频 | 欧美 日韩 国产 一区 | 一二三四在线视频观看社区 | 久久99精品久久久久久 | 亚洲欧美日韩精品久久亚洲区 | 欧美日韩专区 | 色综合99 | 中文字幕在线播放第一页 | 欧美中文字幕一区二区三区亚洲 | 日韩高清中文字幕 | 日本不卡免费新一二三区 | 草久久| 九九九久久国产免费 | 一级国产精品一级国产精品片 |