3

大家好,我的问题如下:我想为我写的一个类写一个测试单元。为此,我有以下 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

我无法弄清楚问题所在。有任何想法吗?

4

3 回答 3

3

您最初的问题是,您尝试通过TransitionSystem接口访问类内部变量 - 您当然只能访问接口中定义的方法(可能还有常量)。这确实是一件好事,因为它将公共合同(接口)与实现类分开!因此,您应该重新考虑您的单元测试以仅使用接口方法!接口(以及在某些需求文档中定义的所需行为)定义了实现类与外部世界的契约,您无法通过其接口测试的任何东西都只是:实现类的内部实现细节)。

于 2013-11-28T22:43:49.520 回答
2

这是基本的成员范围。ConcreteTransitionSystem._initialStates 和 _states 是默认或包级别的可见性。如果您想以这种方式访问​​它们,您可以将它们公开或添加 getter(我推荐后者)。更多在这里http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2013-11-28T22:17:23.243 回答
0

因为编译器认为变量 ts 的类型是“TransitionSystem”。

您可以将代码更改为:

ConcreteTransitionSystem ts = new ConcreteTransitionSystem();
于 2013-11-28T23:48:46.143 回答