2017-03-06 3 views
2

powermocking ProcessBuilderのコンストラクタに問題があります。 ProcessBuilderオブジェクトはモックされず、代わりにnewnullを返します。コード:ProcessBuilderをpowermockできません

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は必要ありません。

新しいを生産コードのどこにでも呼び出すことが問題です。あなたはあなたの依存関係(ProcessBuilderをオブジェクト)を注入できる「伸縮」コンストラクタを持って

public class Runner { 
... 

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

    Runner(ProcessBuilder builder) {... 

と突然のすべて:代わりに、あなたは次のように、依存性注入を使用することができます。突然、PowerMockを使用してと呼ぶ必要があります。新しいは消えます。

ポイントは次のとおりです。PowerMockは「高価」です。かなりの "悪い"副作用があります。単に使用しないでください。

それ以外のところ:PowerMockは非常にうまく動作するはずです。あなたのコードを指示に照らしてチェックするだけです(hereが見つかります)。しかし、言ったように:実際の答えはではないこのようなもののためのPowerMockを使用しています。代わりに:testableコードを書くことを学ぶ。

+0

完全に同意します:「使用しないでください」 「テスト可能なコードを書くことを学ぶ」 – mgaert

+0

@mgaertあなたは大歓迎です;-) – GhostCat

関連する問題