java - 如何参数化 junit 测试套件

标签 java junit4 junit-runner

是否可以在 junit 4 中参数化 TestSuite?

为了将类声明为测试套件,我需要注解@RunWith(Suite.class),但同样的注解也需要将测试声明为参数化:@RunWith( Parameterized.class) 所以我不能将两者添加到同一个类。

我找到了一个类似的 question在这个网站上没有多大帮助。到目前为止,我找到的所有示例都解释了如何参数化简单的单元测试,而不是完整的测试教程。

最佳答案

我认为基本答案是否定的,因为正如您所说,@RunsWith 只接受一个参数。我找到了一个 blog posting that got a bit creative如何处理这种情况。

我们不使用参数化测试,但您可以像我们一样创建一个单独的套件,它只列出测试类,参数化测试可以是其中的一部分。我修改了我们的测试套件以将参数化测试类包含到套件的一部分并且它运行良好。我们像下面这样创建我们的套件,其中 PrimeNumberCheckerTest 是我从网络上提取的一个简单的。

package com.jda.portfolio.api.rest.server;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({  com.mycompany.api.rest.server.resource.TestCartResourceJava.class, 
                 com.mycompany.api.rest.server.resource.TestCustomerResource.class,
                 com.mycompany.api.rest.server.resource.TestWizardProfileResource.class,
                 com.mycompany.api.rest.server.interceptor.TestBaseSearchInterceptor.class, 
                 com.mycompany.api.rest.server.resource.TestQueryParameters.class, 
                 com.mycompany.api.rest.server.expression.TestCartExpressionGenerator.class, 
                 com.mycompany.api.rest.server.expression.TestPreferenceExpressionGenerator.class, 
                 com.mycompany.api.rest.server.PrimeNumberCheckerTest.class, 
                 })
public class AllTests {}

这是参数化测试用例的源代码;

package com.jda.portfolio.api.rest.server:

import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Parameterized.class)
@SuiteClasses({PrimeNumberCheckerTest.class})
public class PrimeNumberCheckerTest {
  private Integer inputNumber;
  private Boolean expectedResult;
  private PrimeNumberChecker primeNumberChecker;

  @Before
  public void initialize() {
     primeNumberChecker = new PrimeNumberChecker();
  }

  // Each parameter should be placed as an argument here
  // Every time runner triggers, it will pass the arguments
  // from parameters we defined in primeNumbers() method
  public PrimeNumberCheckerTest(Integer inputNumber, 
     Boolean expectedResult) {
     this.inputNumber = inputNumber;
     this.expectedResult = expectedResult;
  }

  @Parameterized.Parameters
  public static Collection primeNumbers() {
     return Arrays.asList(new Object[][] {
        { 2, true },
        { 6, false },
        { 19, true },
        { 22, false },
        { 23, true }
     });
  }

  // This test will run five times since we have as many parameters defined
  @Test
  public void testPrimeNumberChecker() {
     System.out.println("Parameterized Number is : " + inputNumber);
     assertEquals(expectedResult, 
     primeNumberChecker.validate(inputNumber));
  }

关于java - 如何参数化 junit 测试套件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22051705/

相关文章:

java - 当调用 JPanel 中的一个鼠标监听器时,它们都会被调用吗?

java - 了解失败的 JUnit4 测试吗?

java - 向 JUnit 测试套件提供输入的普遍接受的方式是什么

java - 如何使用 jUnit 对 Servlet 过滤器进行单元测试? ServletRequest、ServletResponse、FilterChain

android - 如何在android中的Robotium自动化脚本中打开抽屉导航菜单

java - 如何在 libgdx 中将触摸坐标转换为本地对象坐标?

java - Maven 运行/调试配置 : what to put to command line to get Hello world to run

java - Java 中的事件监听器

java - 当我有一个使用 @RunWith 的测试套件时,如何获得更多日志记录反馈?

java - 如何正确关闭 JUnit-Runner?