Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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 Junit5测试同一接口的多个实现_Java_Junit5 - Fatal编程技术网

Java Junit5测试同一接口的多个实现

Java Junit5测试同一接口的多个实现,java,junit5,Java,Junit5,我在IAdder.java中有以下代码: public interface IAdder { int add(int a, int b); public class SimpleAdder implements IAdder { @Override public int add(int a, int b) { return a+b; } } 然后是以下实现(一个在simpleader.java中,另一个在AbsAdder.java中): } } 现在我想使用Junit5进行测试,

我在IAdder.java中有以下代码:

public interface IAdder {

int add(int a, int b);
public class SimpleAdder implements IAdder {

@Override
public int add(int a, int b) {
    return a+b;
}
}

然后是以下实现(一个在simpleader.java中,另一个在AbsAdder.java中):

}

}

现在我想使用Junit5进行测试,因此我开始在SimpleDerTest.java中编写以下内容:

import org.junit.jupiter.api.Test;
导入静态org.junit.jupiter.api.Assertions.*

类SimpleDerTest{

IAdder ia = new SimpleAdder();

@Test
void add() {
    assertEquals(10, ia.add(7, 3));
}
IAdder ia = new AbsAdder();

@Test
void add() {
    assertEquals(10, ia.add(7, 3));
}
}

为了测试AbsAdder,我可以添加以下测试类AbsAdderTest:

import org.junit.jupiter.api.Test;
导入静态org.junit.jupiter.api.Assertions.*

类AbsAdderTest{

IAdder ia = new SimpleAdder();

@Test
void add() {
    assertEquals(10, ia.add(7, 3));
}
IAdder ia = new AbsAdder();

@Test
void add() {
    assertEquals(10, ia.add(7, 3));
}
}


在Junit5中避免这种代码重复的最佳方法是什么?我看过其他关于SO的帖子,但没有人用简单的方式回答这个简单的问题。

你可以使用
@parameteredTest
,在那里你可以通过实现和测试用例,例如

@ParameterizedTest
@MethodSource("sourceMethod")
public void test(IAdder add, int a, int b, int expected) {
    assertEquals(expected, add.add(a, b));
}

public static Stream<Arguments> sourceMethod() {
    final SimpleAdder simpleAdder = new SimpleAdder();
    final AbsAdder absAdder = new AbsAdder();
    return Stream.of(
            Arguments.of(simpleAdder, 2, 3, 5),
            // add more test cases for SimpleAdder, e.g. 
            Arguments.of(simpleAdder, 2, 0, 2),
            Arguments.of(simpleAdder, 0, 4, 4),
            Arguments.of(absAdder, -2, -5, 7),
            // add more test cases for AbsAdder, e.g. 
            Arguments.of(absAdder, -2, 0, 2),
            Arguments.of(absAdder, 0, -9, 9)
    );
}
@ParameterizedTest
@MethodSource(“sourceMethod”)
公共无效测试(IAdder add、int a、int b、int预期){
资产质量(预期,添加。添加(a,b));
}
公共静态流sourceMethod(){
final simpleader simpleader=新simpleader();
最终ABSADER ABSADER=新ABSADER();
回流(
(SimpleReader,2,3,5)的参数,
//为SimpleReader添加更多测试用例,例如。
参数.of(SimpleReader,2,0,2),
参数.of(SimpleReader,0,4,4),
(absAdder,-2,-5,7)的参数,
//为AbsAdder添加更多测试用例,例如。
of(absAdder,-2,0,2),
of(加法器,0,-9,9)
);
}

什么代码重复?它们是两个不同的实现,所以您需要测试这两个用例。类似地,您需要在这两种方法中测试
add(-5,-7)
,尽管结果不同。我认为这不能称为代码重复,因为您正在测试不同的实现。将来可能会有另一个实现,它不会给出7+3=10;是Junit5的一部分吗?需要将该行更改为assertEquals(预期为add.add(a,b));如果我想将MethodSource添加到一个类中的所有测试,该怎么办?@Francescodassis是的,很抱歉,我使用的是hamcrest,谢谢您的编辑<代码>导入静态org.hamcrest.CoreMatchers.*;导入静态org.hamcrest.junit.matcherasert.*可以有任意多个MethodSources和任意多个ParameterizeTests。JUnit只关心一个静态方法,它返回一个参数流以及与参数化测试签名匹配的参数数量/类型。这是你问的吗?也许我还不明白你的最后一个问题?