使用 JUnit 和 AssertJ 测试数组是否包含元素
Test that a array contains elements with JUnit and AssertJ
我使用 JUnit 4.12 和 AssertJ 3.11.0 进行了以下单元测试,结果很有趣。 helloTest
是 green
但 worldTest
是 red
。
@Test
public void helloTest() {
Object[] array = new Object[2];
String[] firstElement = new String[]{"Hello"};
String[] secondElement = new String[]{"World"};
array[0] = firstElement;
array[1] = secondElement;
assertThat(array).containsExactlyInAnyOrder(firstElement, secondElement);
}
@Test
public void worldTest() {
Object[] array = new Object[1];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
AssertJ 的结果是
java.lang.AssertionError:
Expecting:
<[["Hello"]]>
to contain exactly in any order:
<["Hello"]>
elements not found:
<["Hello"]>
and elements not expected:
<[["Hello"]]>
但是为什么呢?
这是类型的问题。以下测试将通过:
@Test
public void worldTest() {
String[][] array = new String[1][];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
您的 worldTest
失败,因为您试图断言类型 Object[]
的对象包含类型 String[]
的元素。您正在使用带有以下声明的方法进行此断言:
ObjectArrayAssert<ELEMENT> containsExactlyInAnyOrder(ELEMENT... values)
此方法要求传入类型与检查中的类型相匹配。在我上面的示例中,这是真的,因此测试通过了。在您的 worldTest
版本中,这是不正确的,因为一种类型是 String[]
而另一种类型是 Object[]
。
我使用 JUnit 4.12 和 AssertJ 3.11.0 进行了以下单元测试,结果很有趣。 helloTest
是 green
但 worldTest
是 red
。
@Test
public void helloTest() {
Object[] array = new Object[2];
String[] firstElement = new String[]{"Hello"};
String[] secondElement = new String[]{"World"};
array[0] = firstElement;
array[1] = secondElement;
assertThat(array).containsExactlyInAnyOrder(firstElement, secondElement);
}
@Test
public void worldTest() {
Object[] array = new Object[1];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
AssertJ 的结果是
java.lang.AssertionError:
Expecting:
<[["Hello"]]>
to contain exactly in any order:
<["Hello"]>
elements not found:
<["Hello"]>
and elements not expected:
<[["Hello"]]>
但是为什么呢?
这是类型的问题。以下测试将通过:
@Test
public void worldTest() {
String[][] array = new String[1][];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
您的 worldTest
失败,因为您试图断言类型 Object[]
的对象包含类型 String[]
的元素。您正在使用带有以下声明的方法进行此断言:
ObjectArrayAssert<ELEMENT> containsExactlyInAnyOrder(ELEMENT... values)
此方法要求传入类型与检查中的类型相匹配。在我上面的示例中,这是真的,因此测试通过了。在您的 worldTest
版本中,这是不正确的,因为一种类型是 String[]
而另一种类型是 Object[]
。