在JUnit中是否有使用@RunWith的解决方法?

4
我有一个主测试类(A)和另一个继承它的类(B)。
A有一个@RunWith(SpringJUnit4ClassRunner.class)注释来初始化它。 我需要在B上使用@RunWith(JUnitParamsRunner.class)注释。
但似乎我不能同时使用两者。有没有一种方法可以拥有参数化的测试套件而不使用@RunWith注释?
另一个解决方案是使用
testContextManager = new TestContextManager(AbstractInvoiceCreationModuleTest.class);
testContextManager.prepareTestInstance(this);

但是我不能在@BeforeClass方法中编写此代码,因为它是静态的,不允许使用this。我不希望在@Before方法中编写上述代码,因为该类将在每个测试方法之前初始化。而且许多测试类都继承自A。
有什么解决办法?
3个回答

2

Spring 在4.2版本中增加了对于基于@Rule的JUnit支持,用于Spring上下文。

http://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/integration-testing.html#testcontext-junit4-rules

以下是官方文档中的一个例子:

// Optionally specify a non-Spring Runner via @RunWith(...)
@ContextConfiguration
public class IntegrationTest {

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

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

   @Test
   public void testMethod() {
      // execute test logic...
   }
}

1

这个链接非常有用,谢谢! - user657592
仅代表个人意见,每个测试方法都初始化Spring应用程序上下文(如博客文章中所示)并不是非常高效的做法,会显著降低测试性能。测试上下文应该被缓存(以某种方式)。例如,spring-test框架只初始化一次上下文,并且它被所有测试共享。 - David Siro

0

我不了解那个具体的案例(Spring测试运行器),但我有一个类似的情况,最终我创建了自己的运行器。


我不想编写一个运行器。那样做违背了使用参数化测试的目的,我将不得不编写逻辑,这可能会引入错误。 - user657592
我提议扩展SpringJunit4ClassRunner到SpringJunit4ParamRunner(或反之亦然)。显然,您不希望创建一个具有特定于测试的逻辑的运行器。虽然编写这样的运行器很痛苦,但只有在有许多具有相同模式的测试时才值得这样做。 - ptyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接