2013-11-28 152 views
3

大家好,我的問題如下: 我想爲我寫的類寫一個testunit。爲此,我有以下的Junit代碼:無法從Java中的junit訪問公共成員變量

1 package ts; 
    2 import ts.TransitionSystem; 
    3 import ts.ConcreteTransitionSystem; 
    4 import java.util.Set; 
    5 import java.util.HashSet; 
    6 import java.util.HashMap; 
    7 
    8 import org.junit.Test; 
    9 public class TransitionSystemTest { 
10 
11 @Test 
12 public void addInitialTest() { 
13  TransitionSystem ts = new ConcreteTransitionSystem(); 
14  ts.addInitialState("test"); 
15  assertTrue(ts._initialStates.contains("test")); 
16  assertTrue(ts._states.get("s0").isEmpty()); 
17 } 
18 
19 } 

我的類看起來如下:

1 package ts; 
    2 
    3 import java.util.Set; 
    4 import java.util.HashSet; 
    5 import java.util.HashMap; 
    6 import ts.TransitionSystem; 
    7 
    8 public class ConcreteTransitionSystem implements TransitionSystem { 
    9 Set<String> aps; 
10 HashMap<String, Set<String>> _states; 
11 Set<String> _initialStates; 
12 
13 public void addInitialState(String s0) { 
14  Set<String> sucessors = new HashSet<String>(); 
15  this._states.put(s0, sucessors); 
16  this._initialStates.add(s0); 
17 } 
18 } 

,它得到的錯誤是:

TransitionSystemTest.java:15: error: cannot find symbol 
    [javac]  assertTrue(ts._initialStates.contains("test")); 
    [javac]    ^
    [javac] symbol: variable _initialStates 
    [javac] location: variable ts of type TransitionSystem 

TransitionSystemTest.java:16: error: cannot find symbol 
    [javac]  assertTrue(ts._states.get("s0").isEmpty()); 
    [javac]    ^
    [javac] symbol: variable _states 
    [javac] location: variable ts of type TransitionSystem 

我無法弄清楚pr oblem。有任何想法嗎?

回答

3

你最初的問題是,你試圖通過TransitionSystem接口訪問類內部變量 - 你當然只能訪問在你的接口中定義的方法(以及可能的常量)。這真的是一件好事,因爲它將公共契約(接口)與實現類分開了!因此,您應該重新考慮單元測試,以便僅使用接口方法!這個接口(連同在一些需求文檔中定義的想要的行爲)定義了實現類到外部世界的契約,並且任何你不能通過它的接口測試的東西就是:實現類的內部實現細節)。

0

因爲編譯器認爲變量ts的類型爲「TransitionSystem」。

您可以將代碼更改爲:

ConcreteTransitionSystem ts = new ConcreteTransitionSystem();