2012-07-14 6 views
1

유닛에 공개 메소드를 테스트 할 EJB가 있습니다. EJB를 pojo로 테스트하고있다. 그래서 저는 그것을 인스턴스화하고 public 메소드를 호출했습니다.개인 환경 변수가있는 클래스를 단위 테스트하기

공개 메소드는 glassfish 환경 속성을 환경 변수가 개인용으로 설정한다는 점에서 문제가 있습니다. 그래서 클래스 외부에서 설정할 수 없으며 환경 객체에 public 메소드를 호출하면 nullPointerException이 발생합니다.

내가 가지고 테스트 할 클래스는, nameServiceEnvironment에 대한 그래서 지금

@Resource(name="NameServiceEnvironment") 
private Properties nameServiceEnvironment; 



    public void setup() { 

     // Set the environment. 
     Properties environment = new Properties(); 
     environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST)); 
     environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT)); 

...} 

는 널 포인터 예외가 발생합니다.

이제 테스트 클래스에서 위 클래스를 인스턴스화하고 setup 메소드를 호출했습니다.

감사합니다.

+0

감사 돈. – Sara

답변

2

개인적인 방법으로도 액세스 할 수 있습니다. 테스트에서 반성을 사용하여 개인 속성에 액세스 할 수 있습니다. 설정하고 설정하십시오.

+0

개인용 메서드가 아닌 리플렉션을 통해 전용 생성자에 액세스하는 것이 가능하다고 생각했습니다. –

+0

틀린 - 당신은 반사 - 방법, ctors, 데이터 회원, 모든 개인 비공개 액세스 할 수 있습니다. – duffymo

+1

http://stackoverflow.com/questions/11483647/how-to-access-private-methods-and-private-data-members-via-reflection –

1

는 귀하의 nameServiceEnvironment는 (그것이 당신의 글래스 피시 환경에서와 같이)

@Resource(name="NameServiceEnvironment") 

은 그래서 당신은 당신의 테스트 환경을 구성하는 자원을 가지고 있는지 확인해야합니다 사용하여 설정합니다. 예를 들어 Spring을 사용할 수 있습니다.

2

단위 테스트를 할 때 nameServiceEnvironment에 대한 설정기를 추가하고 nameServiceEnvironment을 삽입하십시오.

업데이트 코멘트

에 따라 또는, 당신은 특성이 다른 방법으로 설정에서 비트 추출하고 밖으로 가짜로 테스트를 오버라이드 (override) 할 수있다.

public void setup() { 
    setupEnvironment();    
    ... 
} 

void setupEnvironment(){ //you would override this in your unit test 
    Properties environment = new Properties(); 
    environment.setProperty("name.host", this.nameServiceEnvironment.getProperty(NAME_HOST)); 
    environment.setProperty("name.port", this.nameServiceEnvironment.getProperty(NAME_PORT)); 
} 

음, 정확히 가짜는 아닙니다. 테스트에서이 비트를 건너 뛰기 만하면됩니다.

+0

그것이 내가 생각하고 있었던 것이다. 그러나 관리자는 개인 정보 보호를 이유로 glassfish 환경 변수에 대한 setter 또는 getter 메소드를 원하지 않는다고 말합니다. – Sara

+1

글쎄, 세터를 드러내는 것만으로 프라이버시 위험을 안겨줄 지 모르겠다. 어쨌든 대안을 포함하도록 내 대답을 업데이트했습니다. – Liggy

1

nameServiceEnvironment가 삽입되지 않았기 때문입니까? 이것은 Arquillian이 인기를 얻은 이유 중 하나였습니다. 나는 단위 테스트 ejb를 컨테이너에 몇 달 동안 사용했지만, 적어도 (나에게는) 사용하기가 쉽지 않았다. arquillian을 사용하면 모든 종속성 주입을 완료 한 다음 테스트 메소드를 실행할 수 있습니다. 나는 또 다른 제안으로 반사를 사용했습니다. 그리고 어떤 DI 프레임 워크를 사용 하느냐에 따라 테스트 프레임 워크를 구성 할 수도 있습니다. 당신이 작업을 수행하려는 경우

반사 코드 : 편집에 대한

public class ATest { 

@Test 
public void testEjb() throws Exception { 
    MyEJB myEjb = new MyEJB(); 
    Class<? extends MyEJB> cls = myEjb.getClass(); 
    Field field = cls.getDeclaredField("props"); 
    field.setAccessible(true); 
    field.set(myEjb, new Properties()); 
    myEjb.somePublicMethod(); 
} 
class MyEJB { 
    private Properties props; 
    public void somePublicMethod() { 
     System.out.println("props has: " + props); 
    } 
} 

}

+0

예 위 테스트를 수행했습니다. 아직도 나는 같은 예외를 얻고있다. 어쩌면 거기에 개인 변수를 Field로 설정했기 때문일 수도 있지만, 클래스에서는 여기가 Properties 유형입니다. 나는 잘 모르겠다. – Sara

관련 문제