我已经建立了以下课程:
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
)?
提前致谢。
答案 0 :(得分:4)
everyItem
的行为是documented as:
仅在[...]项[...]全部匹配时才匹配
所以空列表总是匹配。
如果那是一个奇怪的死亡,那么考虑它的另一种方式是everyItem
只有在找到与匹配内部匹配项的项目时才会失败。 1 空列表中没有此类项目。
如果您希望测试失败,如果根本没有项目,那么您 2 需要明确断言:
assertThat(BibliotecaApp.getBooksList(), not(empty()));
<子> 1。即使一个人不同意这种等同性,也可以看看the implementation,看看这确实是发生了什么。
<子> 2。但你也可以放弃原来的断言,因为编译器已经强制执行了类型。