2010-05-10 5 views
1

J'utilise powermock pour simuler une invocation de commande native à l'aide du générateur de processus. la chose étrange est ces passes de test parfois et échouent parfois donnant un NPE. Est-ce un problème powermock ou une certaine gotcha dans le programme.Powermock: ProcessBuilder redirectErrorStream donnant nullPointerException

Voici un extrait de la classe je teste:

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); 
    } 
} 

et le boîtier de test unitaire est:

@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); 
    } 
} 

Je reçois une erreur sur l'exécution et le cas de test échoue ..

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

Remarque: Je n'obtiens pas cette erreur pour toutes les exécutions. Parfois ça passe et parfois ça échoue. Je ne suis pas capable de comprendre ce comportement. De plus, j'ai camouflé certains noms de variables à cause des problèmes de droits d'auteur.

+0

des indices ???? n'importe qui ? – kp9

Répondre