PowerMockRunnerを使っているとパラメータの値が異なるだけなのに、コピペしてテストメソッドを増やしてませんか?
@PowerMockRunnerDelegateを使うことでPowerMockRunnerを使いながらParameterizedランナーやTheoriesランナーを使うことができます。
Parameterizedランナーを使用する場合の定義の仕方は
@PowerMockRunnerDelegate(Parameterized.class)
です。
たった1行追加するだけでParameterizedランナーが使えるようになるので、テストメソッドのコピペが不要になりますね。
サンプルソースは下記のようになります。
PowerMockAndParameterized.java
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.is;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Parameterized.class)
@PrepareForTest({System.class})
public class PowerMockAndParameterized {
private final String input;
private final String expected;
public PowerMockAndParameterized(String input, String expected) {
this.input = input;
this.expected = expected;
}
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{"A", "B"},
{"B", "B"}
});
}
@Test
public void Parameterizedを使うよ() {
// SetUp
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getenv(input)).thenReturn("B");
// Test
String actual = System.getenv(input);
// Verify
assertThat(actual, is(expected));
PowerMockito.verifyStatic();
}
}