是否有一种方法可以同时参数化测试类(就像您可以对JUnit 4中的Parameterized
和@Parameters
所做的那样)和测试方法(就像您可以对JUnit 4中的JUnitParams或JUnit 5中的@ParameterizedTest
所做的那样)?最后,我需要获得参数的笛卡尔积。
使用所需方法对java.nio.ByteBuffer
进行部分测试的示例:
public class ByteBufferTest {
private static final int BUFFER_SIZE = 16384;
private final ByteOrder byteOrder;
private ByteBuffer sut;
@Factory(dataProvider = "byteOrders")
public ByteBufferTest(ByteOrder byteOrder) {
this.byteOrder = byteOrder;
}
@DataProvider
public static Object[][] byteOrders() {
return new Object[][] {
{ByteOrder.BIG_ENDIAN},
{ByteOrder.LITTLE_ENDIAN}
};
}
@BeforeMethod
public void setUp() {
sut = ByteBuffer.allocate(BUFFER_SIZE);
sut.order(byteOrder);
}
@Test(dataProvider = "validPositions")
public void position(int position) {
System.out.println(byteOrder + " position " + position);
sut.position(position);
assertThat(sut.position()).isEqualTo(position);
}
@DataProvider
public static Object[][] validPositions() {
return new Object[][] {{0}, {1}, {BUFFER_SIZE - 1}};
}
@Test(dataProvider = "intPositionsAndValues")
public void putInt(int position, int value, byte[] expected) {
System.out.println(byteOrder + " position " + position + " value " + value);
sut.putInt(position, value);
assertThat(sut.array())
.contains(expected[0], atIndex(position))
.contains(expected[1], atIndex(position + 1))
.contains(expected[2], atIndex(position + 2))
.contains(expected[3], atIndex(position + 3));
}
@DataProvider
public Object[][] intPositionsAndValues() {
if (byteOrder == ByteOrder.BIG_ENDIAN) {
return new Object[][]{
{0, 0, new byte[4]},
{5, 123456789, new byte[] {0x07, 0x5B, (byte) 0xCD, 0x15}},
};
} else {
return new Object[][]{
{0, 0, new byte[4]},
{5, 123456789, new byte[] {0x15, (byte) 0xCD, 0x5B, 0x07}},
};
}
}
}
它产生:
LITTLE_ENDIAN position 0
LITTLE_ENDIAN position 1
LITTLE_ENDIAN position 16383
BIG_ENDIAN position 0
BIG_ENDIAN position 1
BIG_ENDIAN position 16383
LITTLE_ENDIAN position 0 value 0
LITTLE_ENDIAN position 5 value 123456789
BIG_ENDIAN position 0 value 0
BIG_ENDIAN position 5 value 123456789
我们正在考虑从TestNG迁移到JUnit 5,但是我们经常使用这种方法。在上面的例子中,字节顺序作为类级参数的使用并不是巧合:我们经常需要对各种二进制数据处理器进行测试,其中测试构造函数将接受字节/位顺序参数,并且我们对大端和小端运行每个测试。
我想为此创建一个扩展,然后使用ExtendWith
,但也许有一个现有的扩展或其他东西,我错过了开箱即用?
1条答案
按热度按时间ojsjcaue1#
JUnit木星(香草)
您可以在
@MethodSource
中组合多个源。基于TestNG示例:这产生:
根据OP的要求,以下是"至少两种不同参数集的试验方法的示例":
3个类参数加上3个具有不同类型和大小的不同方法参数,生成以下输出:
JUnit先锋
JUnit Jupiter有一个JUnit Pioneer扩展包,它附带了
@CartesianTest
。使用上面的扩展示例:这将产生相同的输出。