2013-11-28 3 views
3

안녕하세요. 내 모든 문제는 다음과 같습니다. 클래스를 작성하기 위해 testunit을 작성하고 싶습니다. 이를 위해 나는 다음 Junit와 코드를 다음과 같이Java의 junit에서 public 멤버 변수에 액세스 할 수 없습니다.

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 

나는 알아낼 수 없다. oblem. 어떤 아이디어?

답변

3

초기 문제는 TransitionSystem 인터페이스를 통해 클래스 내부 변수에 액세스하려고 했으므로 인터페이스에 정의 된 메소드 (및 상수)에만 액세스 할 수 있다는 것입니다. 이것은 구현 계약 클래스와 공용 계약 (인터페이스)을 분리하기 때문에 실제로 좋은 것입니다! 따라서 인터페이스 메소드 만 사용하도록 유닛 테스트를 재고해야합니다. 인터페이스는 (일부 요구 사항 문서에서 정의 된 원하는 동작과 함께) 외부 세계에 구현 클래스의 계약을 정의하며, 인터페이스로 테스트 할 수없는 것은 구현 클래스의 내부 구현 세부 사항뿐입니다.

0

컴파일러에서 변수 ts에 "TransitionSystem"유형이 있다고 생각하기 때문에.

ConcreteTransitionSystem ts = new ConcreteTransitionSystem(); 
:

당신은에 코드를 변경할 수 있습니다

관련 문제