【问题标题】:How to avoid Collection.sort() method from executing in a test case?如何避免 Collection.sort() 方法在测试用例中执行?
【发布时间】:2016-09-25 12:09:48
【问题描述】:

您好,我正在为一个程序编写单元测试用例。在那个程序中,我正在测试某种方法,它们就是这种方法: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()); //这也不行

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

请帮忙

【问题讨论】:

  • 提示:请转到帮助中心并阅读如何在您的问题中正确格式化源代码。例如,您不希望所有 &gt; 都在里面!

标签: unit-testing junit mocking mockito


【解决方案1】:

如果您想毫无例外地执行 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));

希望有用。

【讨论】:

    【解决方案2】:

    这在很多层面上都是错误的:

    1. 您正在使用 raw 类型(通过使用 ArrayList 没有泛型类型参数) - 永远不要那样做!
    2. 如果您的测试设置使其他方法返回 null,则不要操作“稍后”的代码 - 而是避免该 null 或确保您的生产代码可以处理它!

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

    A) 如果在现实中,该方法从不返回 null。然后您应该确保您的 test 设置也是如此。

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

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

    【讨论】:

      【解决方案3】:

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

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

      在我看来,返回一个可以排序的模拟列表是要走的路。如果您在测试期间操纵被测类的行为,您将有更高的风险找不到错误。此外,在这种情况下,测试类和被测类之间存在紧密耦合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        相关资源
        最近更新 更多