大家好,我的问题如下: 我想为我写的课写一个testunit。为此,我有以下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
我无法弄清楚问题。有什么想法吗?
答案 0 :(得分:3)
您最初的问题是,您尝试通过TransitionSystem
接口访问类内部变量 - 您当然只能访问接口中定义的方法(以及可能的常量)。这真是一件好事,因为它将公共合同(接口)与实现类分开!因此,您应该重新考虑您的单元测试,以便仅使用接口方法!接口(以及在某些需求文档中定义的需要行为)定义了外部世界的实现类的契约,并且您无法通过其接口测试的任何内容只是:实现类的内部实现细节。
答案 1 :(得分:2)
这是基本的成员范围。 ConcreteTransitionSystem._initialStates和_states是默认或包级别可见性。如果你想以这种方式访问它们,你可以将它们公开或添加getter(我推荐后者)。更多http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
答案 2 :(得分:0)
因为编译器认为变量ts具有类型&#34; TransitionSystem&#34;。
您可以将代码更改为:
ConcreteTransitionSystem ts = new ConcreteTransitionSystem();