首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用参数化运行JUnit SpringJUnit4ClassRunner?

如何使用参数化运行JUnit SpringJUnit4ClassRunner?
EN

Stack Overflow用户
提问于 2015-02-17 11:16:55
回答 4查看 33.1K关注 0票数 67

由于重复的@RunWith注释,下列代码无效:

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(Parameterized.class)
@SpringApplicationConfiguration(classes = {ApplicationConfigTest.class})
public class ServiceTest {
}

但是如何结合使用这两个注释呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-17 12:26:44

要做到这一点,至少有两个选择:

  1. 跟随http://www.blog.project13.pl/index.php/coding/1077/runwith-junit4-with-both-springjunit4classrunner-and-parameterized/ 您的测试需要如下所示: @RunWith(Parameterized.class) @ContextConfiguration( class = {ApplicationConfigTest.class})公共类ServiceTest {私有TestContextManager testContextManager;@在public void setUpContext()抛出异常{ //这是魔术发生的地方之前,我们实际上“用手”做了春季跑步者将为我们做的事情,//读取类波娄的JavaDoc以知道它到底做了什么,方法名称非常准确,尽管this.testContextManager =新TestContextManager(GetClass);this.testContextManager.prepareTestInstance(this);}
  2. 有一个github项目https://github.com/mmichaelis/spring-aware-rule,它建立在以前的博客上,但是以一种通用的方式增加了支持 @SuppressWarnings("InstanceMethodNamingConvention") @ContextConfiguration( class = {ServiceTest.class})公共类SpringAwareTest {@ClassRulePublicStaticFin终SpringAware SPRING_AWARE = SpringAware.forClass(SpringAwareTest.class);@Rule = SPRING_AWARE.forInstance(this);@Rule = new ();.}

因此,您可以有一个实现其中一种方法的基本类,以及从它继承的所有测试。

票数 38
EN

Stack Overflow用户

发布于 2016-06-16 21:08:16

您可以使用Spring提供的SpringClassRule和SpringMethodRule

代码语言:javascript
复制
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.springframework.test.context.junit4.rules.SpringClassRule;
import org.springframework.test.context.junit4.rules.SpringMethodRule;

@RunWith(Parameterized.class)
@ContextConfiguration(...)
public class MyTest {

    @ClassRule
    public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

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

    ...
票数 86
EN

Stack Overflow用户

发布于 2018-08-10 14:02:42

还有一种解决方案是使用JUnit 4.12,而不需要Spring 4.2+。

JUnit 4.12引入了允许参数化测试和Spring注入相结合的ParametersRunnerFactory

代码语言:javascript
复制
public class SpringParametersRunnerFactory implements ParametersRunnerFactory {
@Override
  public Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
    final BlockJUnit4ClassRunnerWithParameters runnerWithParameters = new BlockJUnit4ClassRunnerWithParameters(test);
    return new SpringJUnit4ClassRunner(test.getTestClass().getJavaClass()) {
      @Override
      protected Object createTest() throws Exception {
        final Object testInstance = runnerWithParameters.createTest();
        getTestContextManager().prepareTestInstance(testInstance);
        return testInstance;
      }
    };
  }
}

工厂可以添加到测试类中,以提供测试事务恢复脏上下文servlet测试等完整的Spring支持。

代码语言:javascript
复制
@UseParametersRunnerFactory(SpringParametersRunnerFactory.class)
@RunWith(Parameterized.class)
@ContextConfiguration(locations = {"/test-context.xml", "/mvc-context.xml"})
@WebAppConfiguration
@Transactional
@TransactionConfiguration
public class MyTransactionalTest {

  @Autowired
  private WebApplicationContext context;

  ...
}

如果您需要@参数静态方法中的Spring来提供参数来测试实例,请参见我在这里的答案如何使用带有使用Spring注入的字段的参数化JUnit测试运行程序?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28560734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档