如何测试列表<?扩展对象>是不可修改列表?

2022-09-01 17:17:03

我正在寻找一种方法来测试某些给定的列表是否是不可修改的列表。

我有一个对象,为了提供方法,例如,而不是允许API客户端简单地做,我总是返回此列表的不可修改版本,因此客户端仍然能够拥有该列表。我这样做如下:List<NoMatter>addNoMatter(NoMatter nm).getNoMatters().add(nm);

public List<NoMatter> getNoMatters() {
    return Collections.unmodifiableList(this.noMatters);
}

问题是,当我进行测试时,我根本无法检查此对象的类型是否为UnmodifiableList。我的第一次尝试是做:

@Test
public void checkIfListIsImmutable(){
    assertTrue("List is not immutable", this.myObj.getNoMatters() instanceof UnmodifiableList);
}

碰巧我似乎无法导入类型,也不是我在控制台上尝试时得到的。UnmodifiableListjava.util.Collections$UnmodifiableRandomAccessListSystem.out.println(myObj.getNoMatters().getClass().getName());

那么我该如何实现它呢???

PS.:我知道我可以通过以下操作通过此测试:

@Test(expected = UnsupportedOperationException.class)
public void checkIfListIsImmutable(){
     this.myObj.getNoMatters().add(null);
}

编辑:上面的测试并没有让我知道我处理的列表不是不可变的,因为我需要对可能修改我的原始列表的每个方法进行测试,包括.remove(),.clear(),.shuffle()等!这就是为什么我不认为这是一个很好的方法。

>>>但我仍然相信它甚至没有接近一个优雅的解决方案!<<<


答案 1

我认为你的解决方案不仅合理,而且是优雅的。您希望测试您无法修改列表,并且您的测试简洁地证明了这一点。测试类的名称测试名称,而不是行为。在这种情况下,谁在乎这个名字?

同样,如果我想测试我不能将null传递给某个方法,我会在测试中传递null,并期望一个非法的ArgumentException。


答案 2

我实际上认为这是你最好的选择。您的替代(不太优雅)方法是检查类的名称。

this.myObj.getNoMatters().getClass().getSimpleName().equals("UnmodifiableCollection")

您的问题是包装的不可移动集合是包私有的。

我不认为期望在那里有例外有什么不对,但这只是我。


推荐