Java Junit5测试同一接口的多个实现
我在IAdder.java中有以下代码: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进行测试,
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只关心一个静态方法,它返回一个参数流以及与参数化测试签名匹配的参数数量/类型。这是你问的吗?也许我还不明白你的最后一个问题?