Java assertj double containsSequence
Java assertj double containsSequence
如何在比较双序列时指定对 assertj 的 double/float 容差?这里,items
是一个 List<ScoredItem>
和 ScoredItem
有 2 个属性 itemId
和 score
.
assertThat(items).extracting("score").containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
单元测试期间抛出异常。
java.lang.AssertionError:
Expecting:
<[3.0, 2.0000000298023224, 1.0, 0.3500000052154064, 0.20000000298023224]>
to contain sequence:
<[3.0, 2.0, 1.0, 0.35, 0.2]>
我也试过:
assertThat(items).extracting("score").containsSequence(new double[]{3.0, 2.0, 1.0, 0.35, 0.2}, Offset.offset(0.01));
...但运气不好:(
由于这是从列表中提取的,因此您必须在调用 containsSequence
之前使用 usingComparatorForType
调用通用方法(感谢 纠正了我的颠倒顺序)。然后你可以传入 DoubleComparator
.
assertThat(items)
.extracting("score")
.usingComparatorForType(new DoubleComparator(0.2), Double.class)
.containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
如果items
只是一个double []
,那么你只需要调用方法usingComparatorWithPrecision
assertThat(items)
.usingComparatorWithPrecision(0.5)
.containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
或将第二行的 offset
替换为 withPrecision
assertThat(items).extracting("score")
.containsSequence(new double[]{3.0, 2.0, 1.0, 0.35, 0.2}, withPrecision(0.5));
我已经使用 AssertJ 3.9.1 使用以下代码对此进行了测试:
public class ScoredItem {
public int itemId;
public double score;
public ScoredItem(int i, double s) {
itemId = i;
score = s;
}
public static void main(String[] args) {
List<ScoredItem> items = new ArrayList<ScoredItem>();
items.add(new ScoredItem(1,3.0));
items.add(new ScoredItem(1,2.0));
items.add(new ScoredItem(1,1.1));
items.add(new ScoredItem(1,0.33));
items.add(new ScoredItem(1,0.22));
assertThat(items)
.extracting("score")
.usingComparatorForType(new DoubleComparator(0.2), Double.class)
.containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
}
}
@Magdop 是正确的(断言后调用usingComparatorWithPrecision
除外)。
使用 3.10.0,此测试通过:
@Test
public void containsSequence_with_precision() {
// GIVEN
double[] scores = { 3.0, 2.0000000298023224, 1.0, 0.3500000052154064, 0.20000000298023224 };
// THEN
assertThat(scores).containsSequence(new double[] { 3.0, 2.0, 1.0, 0.35, 0.2 }, withPrecision(0.01));
assertThat(scores).usingComparatorWithPrecision(0.01).containsSequence(new double[] { 3.0, 2.0, 1.0, 0.35, 0.2 });
assertThat(scores).usingComparatorWithPrecision(0.01).containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
assertThat(scores).usingComparatorWithPrecision(0.0001).containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
// fails as expected when uncommented
// assertThat(scores).usingComparatorWithPrecision(0.0000000001).containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
}
usingComparatorWithPrecision
需要在断言之前调用,否则 AssertJ 不会使用它。
withPrecision
是 offset
的别名(恕我直言,更具可读性)。
如何在比较双序列时指定对 assertj 的 double/float 容差?这里,items
是一个 List<ScoredItem>
和 ScoredItem
有 2 个属性 itemId
和 score
.
assertThat(items).extracting("score").containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
单元测试期间抛出异常。
java.lang.AssertionError:
Expecting:
<[3.0, 2.0000000298023224, 1.0, 0.3500000052154064, 0.20000000298023224]>
to contain sequence:
<[3.0, 2.0, 1.0, 0.35, 0.2]>
我也试过:
assertThat(items).extracting("score").containsSequence(new double[]{3.0, 2.0, 1.0, 0.35, 0.2}, Offset.offset(0.01));
...但运气不好:(
由于这是从列表中提取的,因此您必须在调用 containsSequence
之前使用 usingComparatorForType
调用通用方法(感谢 DoubleComparator
.
assertThat(items)
.extracting("score")
.usingComparatorForType(new DoubleComparator(0.2), Double.class)
.containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
如果items
只是一个double []
,那么你只需要调用方法usingComparatorWithPrecision
assertThat(items)
.usingComparatorWithPrecision(0.5)
.containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
或将第二行的 offset
替换为 withPrecision
assertThat(items).extracting("score")
.containsSequence(new double[]{3.0, 2.0, 1.0, 0.35, 0.2}, withPrecision(0.5));
我已经使用 AssertJ 3.9.1 使用以下代码对此进行了测试:
public class ScoredItem {
public int itemId;
public double score;
public ScoredItem(int i, double s) {
itemId = i;
score = s;
}
public static void main(String[] args) {
List<ScoredItem> items = new ArrayList<ScoredItem>();
items.add(new ScoredItem(1,3.0));
items.add(new ScoredItem(1,2.0));
items.add(new ScoredItem(1,1.1));
items.add(new ScoredItem(1,0.33));
items.add(new ScoredItem(1,0.22));
assertThat(items)
.extracting("score")
.usingComparatorForType(new DoubleComparator(0.2), Double.class)
.containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
}
}
@Magdop 是正确的(断言后调用usingComparatorWithPrecision
除外)。
使用 3.10.0,此测试通过:
@Test
public void containsSequence_with_precision() {
// GIVEN
double[] scores = { 3.0, 2.0000000298023224, 1.0, 0.3500000052154064, 0.20000000298023224 };
// THEN
assertThat(scores).containsSequence(new double[] { 3.0, 2.0, 1.0, 0.35, 0.2 }, withPrecision(0.01));
assertThat(scores).usingComparatorWithPrecision(0.01).containsSequence(new double[] { 3.0, 2.0, 1.0, 0.35, 0.2 });
assertThat(scores).usingComparatorWithPrecision(0.01).containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
assertThat(scores).usingComparatorWithPrecision(0.0001).containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
// fails as expected when uncommented
// assertThat(scores).usingComparatorWithPrecision(0.0000000001).containsSequence(3.0, 2.0, 1.0, 0.35, 0.2);
}
usingComparatorWithPrecision
需要在断言之前调用,否则 AssertJ 不会使用它。
withPrecision
是 offset
的别名(恕我直言,更具可读性)。