2017-01-02 118 views
1

比方说,我有书的集合。一个对象的属性(这本书被提取从弹性搜索)如何检查是否一个对象集合包含给定的顺序

class Book { 

String name; 
String author; 

// 10 other properties 

} 

现在在我的JUnit我需要测试书籍是否在name升序(最近我需要测试相同与所有其他11项)

是否有可能测试book顺序没有在我的JUnit测试类创建Book对象?如果是的话如何?

回答

1

看看AssertJ库进行测试,它有它,你能确定如果例如列表进行排序

第一提取物的名称从书:

List<String> names = books.stream() 
          .map(book -> book.getName()) 
          .collect(Collectors.toList()); 

随后使用AssertJ方法来测试像顺序:

Assertions.assertThat(names).isSorted() 

当然,你也可以提供自己的比较,并使用isSortedAccordingTo方法

为参考 http://joel-costigliola.github.io/assertj/core/api/org/assertj/core/api/ArraySortedAssert.html

注:我没尝试编译代码

1

这不是JUnit的具体,但也许this answer在此做有助于:

这表明这个通用方法:

public static <T extends Comparable<? super T>> boolean isSorted(final Iterable<T> iterable) { 
    Iterator<T> iter = iterable.iterator(); 
    if (!iter.hasNext()) { 
     return true; 
    } 
    T t = iter.next(); 
    while (iter.hasNext()) { 
     T t2 = iter.next(); 
     if (t.compareTo(t2) > 0) { 
      return false; 
     } 
     t = t2; 
    } 
    return true; 
} 
0

基本上有两个选项,我看到它:您可以使用一个库来编写(某些)tes更方便,你可以依靠普通的“手工”来做其他事情。

对于图书馆选项,这不是我的专业知识,但我知道有一个数字可供选择。什么pezetem写在another answer关于AssertJ听起来很有希望,特别是isSortedAccordingTo()。不过,它确实要求您为每个要检查的分拣编写Comparator。在做出明智的选择之前,我会仔细看看不同的图书馆,并着眼于除此之外的其他测试。

如果你不喜欢依赖为目的的图书馆,现在,我建议你自己写一个这样的辅助方法:

private static <T extends Comparable<? super T>> boolean isSortedBy(Function<Book, T> getMethod, List<Book> list) { 
    if (list.isEmpty()) { 
     return true; 
    } 
    Iterator<Book> bit = list.iterator(); 
    T attr = getMethod.apply(bit.next()); 
    while (bit.hasNext()) { 
     T nextAttr = getMethod.apply(bit.next()); 
     if (nextAttr.compareTo(attr) < 0) { 
      return false; 
     } 
     attr = nextAttr; 
    } 
    return true; 
} 

你会认识到从this answer逻辑,但我扭了方法签名以符合您的需求。现在,你的测试是非常简单:虽然

assertTrue(isSortedBy(Book::getName, listOfBooks)); 

有两点需要注意:

  1. 我假设你Book类有干将,而且是有原因的,你可能要添加这些,不仅为单元测试。如果不是,您可以使用isSortedBy(b -> b.name, listOfBooks)
  2. 当你说收集,我假设你的意思列表。其他集合类型(如集合)可能没有订单,因此检查它们是否已排序可能没有意义。

如果你想你的方法更普遍,您可以添加其他类型的参数,让其他的事情列出的不是书:

private static <E, T extends Comparable<? super T>> boolean isSortedBy(Function<E, T> getMethod, List<E> list) 

至于我,我会等到我认为有必要,但。

在编写单元测试时,我发现值得思考如何将测试失败报告给测试人员,测试失败时他/她需要什么信息。只有知道列表没有按照应该排序的属性排序,可能没有用处。除非你名单很长,我认为你可能只是转储整个列表作为消息:

assertTrue(listOfBooks.toString(), isSortedBy(Book::getName, listOfBooks)); 

(你要确保你的Book类有这是有用的一个toString方法)有中如果您使用辅助方法返回特定消息,而不仅仅是truefalse,则可以采用更为精确的故障报告方式。

相关问题