2013-03-18 116 views
1

關於我關於測試抽象類的其他線程(可以找到here),我現在的問題是訪問抽象類的私有變量。這與使用Private Accessor有關,但正如我在另一個線程中所陳述的那樣,我無法在單元測試的相同文件內創建私有訪問器。如何訪問抽象類的私有成員

下面是我在談論私有變量:

public abstract class Component { 

    private eVtCompId mComponentId; //enum 
    private eLayer mLayerId; //enum 
    private IF_SystemMessageHandler mLogger; //interface 

我需要知道如何訪問這些,因爲我創建一個單元測試,包括讓這些特殊變量中的值。

+2

您不應該通過單元測試來測試對象的狀態。單元測試的唯一可接受的交互方式是調用方法。 – zerkms 2013-03-18 02:38:55

+3

類的內部實現不應該是單元測試的主題。從理論上講,這個班級「工作」的方式可以改變,不應該導致單元測試失敗,只有班級的公共消費結果/屬性應該保持一致。 – Sepster 2013-03-18 02:40:02

+0

現在你打算違反面向對象的原則。如果您確實想訪問這些變量,請創建一個受保護的函數或一個返回這些變量值並在派生類中訪問它的屬性。 – PSL 2013-03-18 02:45:43

回答

1

你需要使用反射

var instance = new Component(); 
... 
var fieldInfo = typeof(Component).GetField("mComponentId", BindingFlags.Instance | BindingFlags.NonPublic); 
var componentId = (eVtCompId)fieldInfo.GetValue(instance); 
1

如果你不介意有點難看,你可以通過做定義,當你在調試模式下進行編譯,將只被編譯功能:

#if DEBUG 
      ... 
#endif 

然後,您可以定義公有方法,並簡單地返回私有變量的值,以使它們僅可用於單元測試。