如何在模拟时处理私有方法?

时间:2015-03-08 02:42:56

标签: java unit-testing testing mocking

我试图了解如何使用Mockito进行模拟,但我不知道如何处理以下情况:

  1. 您尝试模拟的类中的方法是私有的。
  2. 该方法应保留在课堂上。
  3. 如果将方法公开,可能会导致未来的程序员意外地进行代码行为,因此应该保持私密。
  4. public class Foo {
    
      private final int secret;
    
      public Foo(int s) {
        secret = s;
      }
    
      public void bar() {
        int sum = sum(0);
      }
    
      private int sum(int i) {
        if (i == 1) {
          return i * secret;
        }
        secret -= i;
        return i;
      }
    }
    

    我正在尝试模拟Foo并测试sum的行为是否正确,但我很难决定如何以最小的影响做到最好。我应该将sum方法更改为公开吗?你如何测试这种行为?

3 个答案:

答案 0 :(得分:0)

你的例子非常神秘,很难理解方法的目的。

您说您正在尝试测试sum的行为是否正确。要做到这一点,你可能不应该嘲笑Foo。之一:

  • 通过类的公共方法或
  • 测试sum的功能
  • secret字段的方法和状态移动到另一个可以将sum公开为公共方法的类。

将方法公开用于测试是不可取的,这通常意味着您没有正确的设计,重组代码会更有益。

答案 1 :(得分:0)

你无法使用mockito模拟私有方法。试试powermock

  

查看mockito页面有关模拟私有方法的内容。   https://code.google.com/p/mockito/wiki/MockitoAndPrivateMethods

答案 2 :(得分:0)

你有4种方法可以做到这一点:

  1. 不测试它 - 测试使用私有方法的可见方法
  2. 提高方法的可见性并将其记录为@VisibleForTesting
  3. 使用专门的工具,如powermock或反射来激发方法
  4. 重构您的代码并将私有方法移至包私有类
  5. 很难说哪一个最适合你,这取决于具体情况