2010-05-10 63 views
1

我使用powermock使用進程生成嘲笑一些本地命令調用。奇怪的是這些測試通過有時會失敗,有時會給NPE。這是一個powermock問題或在程序中的一些問題。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 2010-05-17 06:46:07

回答