JavaJUnit:如何断言列表中的所有对象都来自某个类?

JavaJUnit:如何断言列表中的所有对象都来自某个类?,java,junit,tdd,Java,Junit,Tdd,我构建了以下类: public class BibliotecaApp { public static void main(String[] args) { System.out.print("Welcome!"); } public static ArrayList<Book> getBooksList(){ return new ArrayList(); } } 考试通过了,不应该。注意,在实际的方法中,我返回

我构建了以下类:

public class BibliotecaApp {

    public static void main(String[] args) {
        System.out.print("Welcome!");
    }

    public static ArrayList<Book> getBooksList(){
        return new ArrayList();
    }
}
考试通过了,不应该。注意,在实际的方法中,我返回了
ArrayList
(我正在练习TDD)的一个实例,尽管我将方法签名定义为
ArrayList
,但这就是测试通过的原因吗? 如果是这样,我应该如何编写一个测试来确保列表中的每一项都属于某个类(
Book


提前感谢。

每个项目的行为是:

仅当[…]项[…]全部匹配时匹配

因此,空列表将始终匹配

如果这是一个奇怪的diea,那么另一种思考方式是,
everyItem
只有在找到与内部匹配器不匹配的项时才会失败。1空列表中没有此类项

如果您希望在没有任何项的情况下测试失败,那么您还需要明确声明:

assertThat(BibliotecaApp.getBooksList(), not(empty()));

一,。即使你不同意这种等价性,你也可以看一看,这确实是正在发生的事情


二,。但您也可以删除原始断言,因为编译器已经强制执行了该类型。

该列表中没有一项不是
书籍
@OliverCharlesworth该列表不是空的吗?是的,但这不是您的断言测试的目的。@OliverCharlesworth肯定,但是,当列表不完全由书籍实例组成时,我希望测试失败。我应该返回什么样的数据才能实现它?在TDD中,我们验证行为。您的测试验证了一个实现细节(不应该测试),并且加倍了编译器正在执行的类型检查。因此,这个测试(按现状)充其量也没用。谢谢。但这不是我想要断言的。我想断言arraylist中的每个元素是否都是Book对象,我只想知道当BibliotecaApp类中的方法没有返回包含books的数组时,为什么测试会通过。它只返回一个空的ArrayList。@Leandro-我的回答已经解释过了-没有与
isA()
matcher不匹配的项。是的,我知道了。我只是还不明白为什么,对不起,你能用更详细的解释更新答案吗?
assertThat(BibliotecaApp.getBooksList(), not(empty()));