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

时间:2017-12-30 19:43:30

标签: java junit tdd

我已经建立了以下课程:

public class BibliotecaApp {

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

    public static ArrayList<Book> getBooksList(){
        return new ArrayList();
    }
}

我需要测试方法getBooksList()是否返回实际的书籍列表。

我写了以下测试:

@Test
public void everyItemInTheBookListIsABookInstance() throws Exception{
    assertThat(BibliotecaApp.getBooksList(), everyItem(isA(Book.class)));
}

测试正在过去 - 而且不应该。请注意,在实际方法中,我返回ArrayList的实例(我实际上是TDD),虽然我将方法签名定义为ArrayList<Book> - 这是测试通过的原因吗? 如果是这样,我应该如何编写测试以确保系统中的每个项都属于某个类(在此上下文中为Book)?

提前致谢。

1 个答案:

答案 0 :(得分:4)

everyItem的行为是documented as

  

仅在[...]项[...]全部匹配时才匹配

所以空列表总是匹配。

如果那是一个奇怪的死亡,那么考虑它的另一种方式是everyItem只有在找到匹配内部匹配项的项目时才会失败。 1 空列表中没有此类项目。

如果您希望测试失败,如果根本没有项目,那么您 2 需要明确断言:

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

<子> 1。即使一个人不同意这种等同性,也可以看看the implementation,看看这确实是发生了什么。

<子> 2。但你也可以放弃原来的断言,因为编译器已经强制执行了类型。