2014-06-25 2 views
0

void 메소드를 내부적으로 호출하는 메소드를 테스트하려고합니다.mockito를 사용하여 private void 메소드를 호출하는 메소드 테스트하기

아래 코드

public String process(MKSConnectionParams mksConnectionParam, IProgressMonitor progressMonitor) throws Exception { 

    if (null != progressMonitor) { 
     progressMonitor.beginTask("Starting the creation of report", 100); 
    } 
    if (null == mksConnectionParam) { 
     initialize(MksLibFactory.getDefault()); 
    } 
    else { 
     initialize(mksConnectionParam, MksLibFactory.getDefault()); 
    } 
      -------------- 
} 

public void initialize(MKSConnectionParams mksConnectionParam, IMksLibrary mksLibDefault) throws Exception { 
    paramMKSConnectionParams = mksConnectionParam; 
    GlobalConstants.hostName = paramMKSConnectionParams.hostname; 
    GlobalConstants.port = String.valueOf(paramMKSConnectionParams.port); 
    try { 
     localISi = mksLibDefault.getSi(paramMKSConnectionParams); 
     localIIm = mksLibDefault.getIm(paramMKSConnectionParams); 
    } 
    catch (MksLibException | AuthenticationError e) { 
     throw e; 
    } 

    ProjectInfo prjInfo = localISi.getProjectInfo(pathToPj); 
    projRevCmd = prjInfo.getConfigPath().getConfigPath() + "#b=" + projectRevision; 

} 

나는 과정() 메소드 mockito 테스트 케이스를 작성 중입니다. initialize(mksConnectionParam, MksLibFactory.getDefault())이 호출되면 테스트가 실패합니다. 그 과정에서 우리는 실제 mks 연결을 호출하고 있으며 더미 사용자 이름과 암호를 전달하고 있기 때문입니다. 이 초기화 메소드를 조롱 할 수 없습니다. 이 일을 할 수있는 방법이 있습니까?

작은 의사 코드는 큰 도움이 될 것입니다.

앞서 방법을 private으로 초기화했습니다. public으로 변경하면 어떤 차이가 있습니까?

답변

0

이 시나리오를 테스트하는 데는 여러 가지 방법이 있으며, 다른 사람들은 주로 개인적인 취향에 따라 다른 접근 방식을 옹호합니다.

테스트하는 것은 테스트중인 클래스의 코드를 변경해야합니다 (이름은 언급하지 않았다고 생각합니다). 한가지 예외가 있습니다. PowerMock을 사용하는 경우입니다. 여기에 대해서는 자세히 설명하지 않겠지 만, 여러분의 mockito 코드 here에 그것을 통합하는 방법에 대해 자세히 알아 보겠습니다.

일반적인 테스트 방법으로 돌아 가면 IMksLibrary을 모의 대신에 사용하고 있는데 그 이유는 process 방법으로 참조를 얻었 기 때문입니다.

  1. 변경이 process 방법의 서명이 IMksLibrary 인스턴스에 대한 참조를받을 수, 테스트 코드는 그것의 모의를 제공 할 수 있도록
  2. 대신 : 여기 당신이 고려할 수있는 몇 가지 방법입니다 process 메서드 내에서 참조를 만드는 것은 DI 프레임 워크 (예 : Spring, Guice, CDI 등)를 사용하거나 생성자 매개 변수로 클래스에 대한 참조를 삽입합니다.
  3. getIMjsLibraryInstance()과 같은 보호 된 메서드를 만듭니다. 클래스, 즉 MksLibFactory.getDefault()을 반환하고 명시 적 코드 대신 사용합니다 (이것은 Extract Method 요즘 대부분의 IDE에서 자동으로 수행 할 수있는 리펙토링). 테스트 코드에서이 메소드를 재정의하고 모의 객체를 반환하고 실제 클래스 대신 하위 클래스를 테스트하는 하위 클래스를 만들어야한다. 이것은 당신이

당신은 사실상 당신이 정말로 당신이 테스트에 의미 클래스를 테스트하지 않을 때문에, 세 번째 방법을 사용하여 단념 (오히려 느낄 수있는 서브 클래스해야 방법입니다 것을 알 하위 클래스). 나는 이것에 침대 냄새가 나는 것에 동의하는 경향이있다. 그러나 다른 두 메소드와 달리 클래스의 클라이언트를 변경할 필요가 없다는 점을 명심하십시오. (이것은 매우 강력한 인수입니다.)

사용할 수있는 다른 방법이 있지만 처음 두 메서드와 본질적으로 매우 유사하며 코드에서 일부 변경이 필요합니다.

"일반적인"테스트 방법으로는 코드 변경이나 다른 이유로 인해 충분하지 않다고 생각되면 PowerMock을 살펴보고 정적 메서드 호출을 차단할 수 있습니다 IMksLibrary 인스턴스를 반환하고 대신 mock을 반환합니다. 그래도 한 마디. 이러한 유형의 솔루션을 사용할 때 발생하는 몇 가지 심각한 결합이 있습니다. 따라서 정말로 필요하지 않으면 일반적으로 권장하지 않습니다.

관련 문제