t.marcusの外部記憶装置

忘備録とかちょっとした考えとかをつらつらと...

Spring + JUnitでParameterized実行する

qiita.com

上記のQiita記事通りにやっても動かなかったので…

以下のような感じで、@ClassRuleと@Ruleを宣言してやれば無事動いた

package org.tmarcus

import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.rules.SpringClassRule;
import org.springframework.test.context.junit4.rules.SpringMethodRule;

@ActiveProfiles("test")
@SPringApplicationConfiguration(ParameterizedTestBase.class)
@EnableAutoConfiguration
@ComponentScan(basePackages = {
  "org.tmarcus"
})
@RunWith(Parameterized.class)
public ParameterizedTestBase extends TestBase {
  
  @ClassRule
  public static final SpringClassRule SCR = new SpringClassRule();

  @Rule
  public final SpringMethodRule springMethodRule = new SpringMethodRule();

}
package org.tmarcus

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runners.Parameterized;
import org.tmarcus.service.MathmaticsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestContextManager;

import java.util.Collection;
import java.util.List;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@Slf4j
public class SampleTest extends ParameterizedTestBase {

  private MathmaticsService service;

  @Autowired
  public void inject(
      MathmaticsService service) {
    this.service = service;
  }

  @Parameterized.Parameters
  public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] {
      { 0, 1 },
      { 1, 1 },
      { 2, 2 },
      { 3, 6 },
      { 4, 24 },
      { 5, 120 }
    });
  }

  @Parameterized.Parameter(0)  // <- index=0のパラメータを代入する
  public int parameter;

  @Parameterized.Parameter(1)  // <- index=1のパラメータを代入する
  public int factorialExpected;

  @Test
  public void test() {
    log.info("{} -> {}", parameter, expected);
    assertThat(service.factorial(parameter), is(factorialExpected));
  }
}