Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用参数编写单元测试?_Java_C#_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 如何使用参数编写单元测试?

Java 如何使用参数编写单元测试?,java,c#,unit-testing,junit,mockito,Java,C#,Unit Testing,Junit,Mockito,我不熟悉java,但在c#(NUnit)中,您可以通过添加[TestCase]属性来参数化单元测试,如下所示: [TestCase(12,3,4)] [TestCase(12,2,6)] [TestCase(12,4,3)] public void DivideTest(int n, int d, int q) { Assert.AreEqual( q, n / d ); } 在这种情况下,我们不必为每个测试用例编写单独的单元测试。相反,我们需要编写[TestCase]来更改值 Java

我不熟悉java,但在c#(NUnit)中,您可以通过添加
[TestCase]
属性来参数化单元测试,如下所示:

[TestCase(12,3,4)]
[TestCase(12,2,6)]
[TestCase(12,4,3)]
public void DivideTest(int n, int d, int q)
{
   Assert.AreEqual( q, n / d );
}
在这种情况下,我们不必为每个测试用例编写单独的单元测试。相反,我们需要编写[TestCase]来更改值

Java上有等价物吗?
当前使用JUnit4.12的参数化是您所需要的。考虑下面的例子。请注意,test3显然是红色的,因为20/5=4

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class DividerTest {

  private int dividend;
  private int divisor;
  private int expectedResult;

  @Parameterized.Parameters
  public static Collection<Object[]> data() {
    Object[] test1 = { 10, 5, 2 };
    Object[] test2 = { 15, 5, 3 };
    Object[] test3 = { 20, 5, 5 };

    return Arrays.asList(test1, test2, test3);
  }

  public DividerTest(int dividend, int divisor, int expectedResult) {
    this.dividend = dividend;
    this.divisor = divisor;
    this.expectedResult = expectedResult;
  }

  @Test
  public void testDivider() {
    assertEquals(expectedResult, dividend / divisor);
  }
}
导入静态org.junit.Assert.assertEquals;
导入java.util.array;
导入java.util.Collection;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.Parameterized;
@RunWith(参数化的.class)
公共类分割测试{
私人股息;
私有整数除数;
私有内部预期结果;
@参数化。参数化
公共静态收集数据(){
对象[]test1={10,5,2};
对象[]test2={15,5,3};
对象[]test3={20,5,5};
返回Arrays.asList(test1、test2、test3);
}
公共除数测试(整数除数、整数除数、整数预期结果){
这个。股息=股息;
这个除数=除数;
this.expectedResult=expectedResult;
}
@试验
公共无效测试分隔器(){
资产质量(预期结果、股息/除数);
}
}
以下是测试结果:


参数化是您所需要的。考虑下面的例子。请注意,test3显然是红色的,因为20/5=4

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class DividerTest {

  private int dividend;
  private int divisor;
  private int expectedResult;

  @Parameterized.Parameters
  public static Collection<Object[]> data() {
    Object[] test1 = { 10, 5, 2 };
    Object[] test2 = { 15, 5, 3 };
    Object[] test3 = { 20, 5, 5 };

    return Arrays.asList(test1, test2, test3);
  }

  public DividerTest(int dividend, int divisor, int expectedResult) {
    this.dividend = dividend;
    this.divisor = divisor;
    this.expectedResult = expectedResult;
  }

  @Test
  public void testDivider() {
    assertEquals(expectedResult, dividend / divisor);
  }
}
导入静态org.junit.Assert.assertEquals;
导入java.util.array;
导入java.util.Collection;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.Parameterized;
@RunWith(参数化的.class)
公共类分割测试{
私人股息;
私有整数除数;
私有内部预期结果;
@参数化。参数化
公共静态收集数据(){
对象[]test1={10,5,2};
对象[]test2={15,5,3};
对象[]test3={20,5,5};
返回Arrays.asList(test1、test2、test3);
}
公共除数测试(整数除数、整数除数、整数预期结果){
这个。股息=股息;
这个除数=除数;
this.expectedResult=expectedResult;
}
@试验
公共无效测试分隔器(){
资产质量(预期结果、股息/除数);
}
}
以下是测试结果:


TestNG是一个库和框架,它使用数据工厂和依赖项注入对测试参数进行了出色的控制。

TestNG是一个库和框架,它使用数据工厂和依赖项注入对测试参数进行了出色的控制。

看看参数化测试()。注意构造函数-您可以指定该方法可以使用多少个参数。在Java中没有那么漂亮(也可能没有那么好),但这将是一种选择,您可以为不同的测试重用相同的测试用例data@robjob27,我查看了您提供的链接。但它看起来不像努尼特。有没有可能让它看起来更优雅。我所说的优雅是指像努尼特一样的简单。或者至少,我可以选择为它编写新属性并在后面将其转换为JUnit样式吗?@AkinerAlkan是的,我同意。这些看起来一点也不漂亮。顺便说一句,C#中有一点非常酷,那就是理论。基本上类似于上面的测试用例,但它进一步抽象了它。注意构造函数-您可以指定方法可以使用多少个参数。在Java中没有那么漂亮(也可能没有那么好),但这将是一种选择,您可以为不同的测试重用相同的测试用例data@robjob27,我查看了您提供的链接。但它看起来不像努尼特。有没有可能让它看起来更优雅。我所说的优雅是指像努尼特一样的简单。或者至少,我可以选择为它编写新属性并在后面将其转换为JUnit样式吗?@AkinerAlkan是的,我同意。这些看起来一点也不漂亮。顺便说一句,C#中有一点非常酷,那就是理论。基本上类似于上面的测试用例,但它进一步抽象了它。这是一个很好的示例,我知道这与nunit的逻辑相同,但表示不同。我想知道的是:我们是否可以编写某种通用代码并简化集合的创建,就像nunit场景中那样。那么在这种情况下,我们可以使用与现在完全相同的实现,比如[TestCase(x,y,z)],我认为Junit不支持[TestCase(x,y,z)]。所以答案还没有:)还没有,但是JUnit5中有更好的参数化支持。也许没有那么优雅,但它很接近。查看@CsvSource:这是一个很好的例子,我知道这与nunit的逻辑相同,但表示不同。我想知道的是:我们是否可以编写某种通用代码并简化集合的创建,就像nunit场景中那样。那么在这种情况下,我们可以使用与现在完全相同的实现,比如[TestCase(x,y,z)],我认为Junit不支持[TestCase(x,y,z)]。所以答案还没有:)还没有,但是JUnit5中有更好的参数化支持。也许没有那么优雅,但它很接近。签出@CsvSource: