在Java8中使用另一个数组测试数组的正确排序



我的应用程序需要对对象数组进行任意排序。

这是我提出的代码的简化版本:

对象:

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);
}

所谓magicAssertionsomeMagicalStream,我的意思是我再次使用我提供的排序数组遍历函数的结果,并确保顺序正确。我怀疑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);
}

最新更新