我的应用程序需要对对象数组进行任意排序。
这是我提出的代码的简化版本:
对象:
public class MyObject {
Integer number;
String name;
// Getters and setters
现在,数字整数实际上是枚举中的X个数字之一。
功能:
private List<MyObject> sort(List<MyObject> toSort, List<Integer> order){
toSort.sort(Comparator.comparingInt(o -> order.indexOf(o.getNumber())));
return toSort;
}
所以,我把所有东西都放在一个简单的应用程序中,只是为了测试这个功能:
你可以自己试试
public static void main(String[] args){
Application app = new Application();
List<MyObject> myObjects = new ArrayList<>();
myObjects.add(new MyObject(1, "IN"));
myObjects.add(new MyObject(2, "THESE"));
myObjects.add(new MyObject(3, "ORDER"));
myObjects.add(new MyObject(4, "RANDOM"));
myObjects.add(new MyObject(5, "ARE"));
myObjects.add(new MyObject(6, "COMPLETELY"));
List<Integer> defaultOrder = Arrays.asList(2,5,1,6,4,3);
app.sort(myObjects, defaultOrder).stream().map(MyObject::getName).forEach(System.out::println);
}
到目前为止,一切都很好。这会产生所需的结果,因为它会打印出来:
THESE
ARE
IN
COMPLETELY
RANDOM
ORDER
但我一直在测试这个。
我如何设置一个测试,这样就会发生这样的事情:
@Test
void Given_TheLists_When_ArbitrarilySorting_Then_GetExpectedResults(){
List<MyObject> myObjects = new ArrayList<>();
//The actual objects are pulled from the database (I can mock that),
//But the idea is that this applies to any list of myObjects (remember the enum)
List<Integer> defaultOrder = Arrays.asList(5,3,6,2,4,1); //This has the same size as the enum
magicAssertion(app.sort(myObjects, defaultOrder)).someMagicalStream()...etc);
}
所谓magicAssertion和someMagicalStream,我的意思是我再次使用我提供的排序数组遍历函数的结果,并确保顺序正确。我怀疑java文档中有一条随意嘲笑我的流。
第页。D.我写这篇文章花了这么长时间,我能想明白吗?嗯,可能不会。
首先,不需要在以下方法中返回:
private void sort(List<MyObject> toSort, List<Integer> order){
toSort.sort(Comparator.comparingInt(o -> order.indexOf(o.getNumber())));
}
假设您使用的是junit
,则可以使用Assert
类方法。Assert.assertArrayEquals(expectedList.toArray(), actualOutputList.toArray())
,或者您可以尝试任何测试库,如testng
,它具有用于验证集合的断言方法。
@Test
void Given_TheLists_When_ArbitrarilySorting_Then_GetExpectedResults(){
List<MyObject> myObjects = mockData();
List<Integer> defaultOrder = Arrays.asList(5,3,6,2,4,1);
List<MyObject> expectedObjects = //.. list of objects in expected order.
app.sort(myObjects, defaultOrder);
// myObjects are now sorted. Validate against the expected list.
org.junit.Assert.assertArrayEquals(expectedObjects.toArray(), myObjects.toArray());
// If you are using testNG
org.testng.Assert.assertEquals(myObjects, expectedObjects);
}