如何避免Collection.sort()方法在测试用例中执行?

时间:2016-09-25 12:09:49

标签: unit-testing junit mocking mockito

您好我正在为一个程序编写单元测试用例。在那个程序中,我正在测试一个特定的方法,即它是这个方法:Collections.sort(Arraylist object)。 它是这样的。

public void abc(){ 
  try{ 
   Arraylist<object_class> object=some_method.get(list);
   Collections.sort(object); 
   System.out.print("The whole functon is executing successfully") }
   catch(exception e)   { 
         system.out.print("error message")  } }

我调用的some_method.get(list)`方法正在发送一个空列表,所以当调用Collections.sort()时,它会进入catch块而其余代码不会被执行。 我可以做什么,以便在测试用例运行时不调用此Collections.sort()方法。

PS-以上代码仅用于解释问题,我无法对主类进行更改

在测试类中,我尝试使用此方法

Mockito.doNothing()。when(collections.sort(Mockito.anyList())); //这不起作用

所以我尝试了这个Mockito.doNothing()。when(collections.class).sort(Mockito.anyList()); //这也不起作用

我可以将一个模拟列表返回给object,但我想知道是否可以阻止Collections.sort()执行。

请帮忙

3 个答案:

答案 0 :(得分:2)

如果您想要执行Collections.sort()而没有任何异常,请执行以下步骤:

1)在测试类中创建一个带有虚拟值的列表对象,并将其发送到主类

list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

2)第二步是确保你的

some_method.get(list);

返回一个对象的ArrayList,

3)由于Collections类具有静态方法排序,JVM将像往常一样执行其余代码。并且不会通过任何例外。

PS-如果Mockito.doNothing()不起作用尝试PowerMockito.doNothing(),它可能会起作用并确保你有

1)@PrepareforTest(Collections.class)

2)PowerMockito.mockStatic(Collections.class);

3)PowerMockito.doNothing()。when(Collections.sort(obj));

希望它有用。

答案 1 :(得分:1)

这在许多层面都是错误的:

  1. 您在那里使用原始类型(通过使用ArrayList 而不是泛型类型参数) - 永远不要这样做!
  2. 如果您的测试设置使其他方法返回null,则不要操作&#34;稍后&#34;代码 - 而不是避免 null 或确保您的生产代码可以处理它!
  3. 换句话说:只有两个合理的选择:

    A)如果实际上,该方法从不返回null。那么你应该确保你的测试设置也是如此。

    B)如果实际上,该方法也返回null ...那么你的生产代码需要处理它,例如在调用sort之前进行空检查!

    最后:特别是对于列表,这个问题确实根本不存在:答案是 - 你永远永远不会返回null!相反,如果没有数据,则返回列表。可以对空列表进行排序而不会出现问题!长话短说:首先避免返回 null

答案 2 :(得分:0)

  

我可以将一个模拟列表返回给object,但我想知道是否可以阻止Collections.sort()执行。

我没有办法防止这种情况发生 只要执行调用它的方法并且只要您不能更改测试代码,就会执行Collections.sort()。原因是sort是一种静态方法。您可以传递或注入一个模拟实例来实现您的目标。

返回一个可以排序的模拟列表是我认为的方法。如果在测试期间操纵测试类的行为,则发现错误的风险更高。此外,在这种情况下,测试类和测试类之间存在紧密耦合。