【问题标题】:how to mock method from same class using junit如何使用junit模拟来自同一类的方法
【发布时间】:2016-11-01 12:33:48
【问题描述】:

我正在使用JUnit,我的情况如下:

class A{
    public int[] method1(){
       ...
       int res = method2();
       ...
       return intArray;
    }

    public int method2(){
      ....
      return intA;
    }
}

我正在尝试关注 method2()

new MockUp<MockClass>() {
            int[] methodToMock() {
                int[] mockedResult = {1, 2, 4, 6};
                return mockedResult;
            }
        };

当我将上面的代码用于另一个类时,它可以正常工作。 但是,如果我想从同一个类中模拟方法,它就行不通了。

请指导我在 JUnit 中找到模拟方法,模拟来自同一类的方法。

谢谢。

【问题讨论】:

  • 首先你应该问自己为什么你要模拟method2?它是否包含超出类其他范围的行为?如果不是它自己的类,是否应该将其移至其他类?
  • 你没有告诉你使用的是哪个模拟框架。如果您使用 Mockito,您可以为被测类创建 spy 并为 method2 配置替代行为。
  • @TimothyTruckle 我正在使用 JMockit。
  • 我不能将此方法移动到任何其他类。而且这种方法也用在其他地方,所以我不能把它合二为一。

标签: java unit-testing junit mocking


【解决方案1】:

public method 调用同一类的另一个public method 在软件开发中不一定是问题,但它会在您的类中产生内部耦合,并且可能表明类中的责任过多。 不一定总是正确的,但可能会提出问题。
证明:在这里,没有欺骗,单元测试变得更加困难。

我不能将此方法移动到任何其他类。而且这个方法也是 在其他地方用过,所以我不能用它一次。

有了这些限制,我建议你保留这两个公共方法,并引入一个新类来考虑这两种方法的共同行为。
这两个公共方法现在可以依赖公共类来进行处理。

class A{

  private CommonProcess commonProcess;

  public int[] method1(){
   ...
   int res = commonProcess.method(...);
   ...
   return intArray;
  }

  public int method2(){
   ....
   commonProcess.method(...);
   ...
   return intA;
  }
}

现在,要模拟method2method1 中的外部依赖项,只需模拟对commonProcess.method() 的调用。

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2016-07-17
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多