2017-03-06 6 views
2

나는 powermocking ProcessBuilder의 생성자에 문제가있어. ProcessBuilder 개체는 조롱되지 않으며 대신 newnull을 반환합니다. 코드 :powermock ProcessBuilder

import java.util.concurrent.Executors; 

public class Runner { 
    private ProcessBuilder processBuilder; 

    public ProcessBuilder getProcessBuilder() { 
     return processBuilder; 
    } 

    public void run() { 
     processBuilder = new ProcessBuilder("command", "parameter"); 
    } 

    public void runInSubclass() { 
     final SubRunner subRunner = new SubRunner(); 
     subRunner.run(); 
    } 

    public void runInThread() { 
     Executors.newSingleThreadExecutor().execute(new SubRunner()); 
    } 

    private class SubRunner extends Thread { 
     public void run() { 
      processBuilder = new ProcessBuilder("command", "parameter"); 
     } 
    } 
} 

테스트 (모두 실패) :

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import static org.hamcrest.CoreMatchers.*; 
import static org.junit.Assert.assertThat; 
import static org.powermock.api.mockito.PowerMockito.mock; 
import static org.powermock.api.mockito.PowerMockito.whenNew; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Runner.class) 
public class RunnerTest { 
    private Runner runner; 

    @Before 
    public void setUp() throws Exception { 
     runner = new Runner(); 
     ProcessBuilder processBuilderMock = mock(ProcessBuilder.class); 

     whenNew(ProcessBuilder.class).withAnyArguments().thenReturn(processBuilderMock); 
    } 

    @Test 
    public void run() throws Exception { 
     runner.run(); 
     assertThat(runner.getProcessBuilder(), is(not(nullValue()))); 
    } 

    @Test 
    public void runInSubclass() throws Exception { 
     runner.runInSubclass(); 
     assertThat(runner.getProcessBuilder(), is(not(nullValue()))); 
    } 

    @Test 
    public void runInThread() throws Exception { 
     runner.runInThread(); 
     Thread.sleep(100); 
     assertThat(runner.getProcessBuilder(), is(not(nullValue()))); 
    } 
} 

나는 최신 PowerMock (1.6.6)를 사용하고 있습니다.

+1

'문제가 있습니다 ...'제발, 정확히 무슨 일이 일어 났는지, 왜 문제인지 설명해주세요. –

+0

@defaultlocale, updated. new는 null을 반환하고 모든 테스트가 실패합니다. –

답변

1

이 문제를 해결하기 위해 PowerMock이 필요하지 않습니다.

귀하의 문제는 생산 코드의 모든 곳에서 으로 전화하는 것이란 점입니다. 당신은 당신이 당신의 의존성 (A ProcessBuilder를 객체)를 주입 할 수있는 "끼워"생성자가

public class Runner { 
... 

    public Runner() { 
    this (new ProcessBuilder()); 
    } 

    Runner(ProcessBuilder builder) {... 

와 갑자기 대신, 당신은 같은 의존성 주입을 사용할 수 있습니다. 갑자기 PowerMock을 사용하여 으로 전화해야하는 모든 일이 사라집니다.

요점은 : PowerMock은 "비싸다"; 그것은 꽤 "나쁜"부작용이 있기 때문에. 단순히 사용하지 마십시오.

그 외에도 : PowerMock은 작업을 아주 잘 처리해야합니다. 코드의 지침을 확인하십시오 (찾을 수 here); 하지만 말했다 : 진짜 대답 이 같은 물건에 대한 PowerMock을 사용하지 않습니다. 대신 : testable 코드를 작성하는 법을 배우십시오.

+0

전혀 동의하지 않음 : "사용하지 마십시오." 테스트 가능한 코드 작성법을 배우십시오. " – mgaert

+0

@mgaert 매우 환영합니다 ;-) – GhostCat