2016-09-25 38 views
1

嗨我正在编写一个程序的单元测试用例。在那个程序中,我正在测试一个方法,它们是这个方法:Collections.sort(Arraylist对象)。 它是这样的。如何避免在测试用例中执行Collection.sort()方法?

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(名单)`方法我打电话发出了一个空的列表,以便当Collections.sort()被调用它转到catch块,不执行剩下的代码。 我该怎么做才能让这个Collections.sort()方法在测试用例运行时不被调用。

PS-上面的代码是唯一的解释的问题和我不能更改主类

在测试类我试图用这种方法

Mockito.doNothing()。当(collections.sort (Mockito.anyList())); //这是不工作

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

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

请帮

+0

提示:请转到帮助中心,阅读如何正确格式化问题中的源代码。例如,你不希望所有那些'>'! – GhostCat

回答

0

我可以返回一个列表模拟反对,但我想知道如果我能阻止Collections.sort()的执行。

我不明白的方式,以防止 Collections.sort()是只要执行与调用它执行和方法,只要你不能改变的测试代码。原因是sort是一个静态方法。您可以传递或注入一个模拟实例来实现您的目标。

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

1

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

  1. 您使用的是原料类型有(通过使用ArrayList的没有泛型类型参数) - 从来没有做到这一点!
  2. 如果您的测试设置使得其他方法返回null,那么请勿操作“稍后”的代码 - 相反要么避免使用null或确保您的生产代码可以处理它!

换句话说:只有两种合理的选择:

A)如果在现实中,这种方法从未返回null。那么你应该确保,你的测试设置也是如此。 B)如果实际上该方法也返回null,那么你的生产代码需要处理这个问题,例如在调用sort之前做一个空检查!

最后:特别是对于列表,这个问题真的不存在都:答案是 - 你永远永远返回null!如果没有数据,则返回一个空的列表。空列表可以排序没有问题!长话短说:首先避免返回null

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

希望它有用。

相关问题