dimanche 5 mars 2017

Cannot powermock ProcessBuilder

I've got problems powermocking ProcessBuilder's constructor.

Code:

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

Test:

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 getProcessBuilder() throws Exception {
        assertThat(runner.getProcessBuilder(), is(nullValue()));
    }

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

I'm using the lastest PowerMock (1.6.6).

Aucun commentaire:

Enregistrer un commentaire