2010-05-10 3 views
1

프로세스 빌더를 사용하여 일부 기본 명령 호출을 조롱하기 위해 powermock을 사용하고 있습니다. 이상한 일은 때때로 이러한 시험 합격이며 때로는 NPE를 제공하지 못합니다. 이것은 프로그램에서 powermock 문제 또는 일부 gotcha입니다. 여기 Powermock : processBuilder redirectErrorStream nullPointerException을주는

내가 테스트하고있는 클래스의 코드 조각입니다 :

public void method1(String jsonString, String filename) { 
    try { 
    JSONObject jObj = new JSONObject(jsonString); 
    JSONArray jArr = jObj.getJSONArray("something"); 

    String cmd = "/home/y/bin/perl <perlscript>.pl<someConstant>" + " -k " + <someConstant> + " -t " + <someConstant>; 

    cmd += vmArr.getJSONObject(i).getString("jsonKey"); 

    ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd); 
    pb.redirectErrorStream(false); 
    Process shell = pb.start(); 
    shell.waitFor(); 
    if (shell.exitValue() != 0) { 
     throw new RuntimeException("Error in Collecting the logs. cmd="+cmd); 
    } 
    StringBuilder error = new StringBuilder(); 
    InputStream iError = shell.getErrorStream(); 
    BufferedReader bfr = 
     new BufferedReader(
     new InputStreamReader(iError)); 
    String line = null; 
    while ((line = bfr.readLine()) != null) { 
     error.append(line + "\n"); 
    } 
    if (!error.toString().isEmpty()) { 
     LOGGER.error(error`enter code here`); 
    } 
    iError.close(); 
    bfr.close(); 
    } catch (Exception e) { 
    throw new RuntimeException(e); 
    } 
} 

및 단위 테스트 케이스이다 :

@PrepareForTest({<Classtobetested>.class, ProcessBuilder.class,Process.class, InputStream.class,InputStreamReader.class, BufferedReader.class}) 
@Test(sequential=true) 
public class TestClass { 

@Test(groups = {"unit"}) 
public void testMethod() { 
    try { 
    ProcessBuilder prBuilderMock = createMock(ProcessBuilder.class); 
    Process processMock = createMock(Process.class); 
    InputStream iStreamMock = createMock(InputStream.class); 
    InputStreamReader iStrRdrMock = createMock(InputStreamReader.class); 
    BufferedReader bRdrMock = createMock(BufferedReader.class); 
    String errorStr =" Error occured"; 

    String json = <jsonStringInput>; 
    String cmd = "/home/y/bin/perl <perlscript>.pl -k "+<someConstant>+" -t "+<someConstant>+" "+<jsonValue>; 

    expectNew(ProcessBuilder.class, "bash", "-c", cmd).andReturn(prBuilderMock); 
    expect(prBuilderMock.redirectErrorStream(false)).andReturn(prBuilderMock); 
    expect(prBuilderMock.start()).andReturn(processMock); 
    expect(processMock.waitFor()).andReturn(0); 
    expect(processMock.exitValue()).andReturn(0); 
    expect(processMock.getErrorStream()).andReturn(iStreamMock); 
    expectNew(InputStreamReader.class, iStreamMock) 
       .andReturn(iStrRdrMock); 
    expectNew(BufferedReader.class, iStrRdrMock) 
       .andReturn(bRdrMock); 
    expect(bRdrMock.readLine()).andReturn(errorStr); 
    expect(bRdrMock.readLine()).andReturn(null); 
    iStreamMock.close(); 
    bRdrMock.close(); 
    expectLastCall().once(); 
    replayAll(); 
    <ClassToBeTested> instance = new <ClassToBeTested>(); 
    instance.method1(json, fileName); 
    verifyAll(); 
    } catch (Exception e) { 
    Assert.fail("failed while collecting log.", e); 
    } 
} 

나는 실행에 오류가 발생하고 테스트 케이스에 ..

실패
Caused by: java.lang.NullPointerException 
at java.lang.ProcessBuilder.start(ProcessBuilder.java:438) 

참고 : 모든 실행에서이 오류가 표시되지 않습니다. 때로는 통과하고 때로는 실패합니다. 나는이 행동을 이해할 수 없다. 또한 저작권 문제로 인해 변수 이름을 위장한 적이 있습니다.

+0

모든 단서 ???? 누구? – kp9

답변

관련 문제