【问题标题】:Mockito: Unable to mock a static & non-static methodMockito:无法模拟静态和非静态方法
【发布时间】:2016-03-24 08:43:14
【问题描述】:

我无法从 mockito 模拟任何东西(静态或非静态方法),

这些是我的课,

Calculations.java

public class Calculations {

    public void printZero() {
        System.out.println("zero");
    }

    public static void printOne() { 
         System.out.println("one");
    }
}

这是我的 PostData.java

public class PostData {

    public static Calculations calc = new Calculations();
    public static void postTheData() {

        calc.printZero();
        Calculations.printOne();
    }
}

单元测试类, 测试类.java

public class TestClass {

    @Test
    public void addTest() {

        Calculations lmock = mock(Calculations.class);

        // can't have Calculations.calc.printZero() in when() :cause: argument passes to when() must be a mock object.
        doNothing().when(lmock).printZero();

        // cause: method when(void) is undefined for the type TestClass
        // when(lmock.printZero()).doNothing();

        // cause: argument passed to when() must be a mock object.
        // doNothing().when(Calculations.printOne());

        PostData.postTheData();
    }
}

它已编译并在我的输出中打印“零”和“一”,理想情况下应该被忽略。

我将 cloud-mockito-all-1.10.19.jar 用于 mockito。 还有junit最新的jar文件。

我知道我在这里遗漏了一些东西,但不知道是什么!如果你能回答我,那将是一个很大的帮助。

【问题讨论】:

  • 您实际上并没有使用模拟的 Calculations 类 - 您正在使用 PostData 中的静态类。不过,您需要使用 PowerMockito 来模拟静态方法。
  • “我无法从 mockito 模拟任何东西(静态或非静态方法)” 所以你可以在 mockito 中模拟静态方法,即使它不起作用并且不支持?为此,您需要 PowerMock 之类的其他东西。

标签: java unit-testing junit mockito powermockito


【解决方案1】:

问题在于PostData 没有使用模拟的Calculations 对象。

为了做到这一点,您可以为 calc 字段添加一个设置器(并且可能将其更改为非静态)并将 PostDatacalc 字段设置为模拟字段。

【讨论】:

  • 非常感谢鲍勃!实际上,我不能在 PostData.java 中添加任何东西,但事实证明我必须向它添加一些东西(来自我看到的许多博客)。感谢二传手的想法。你太棒了!
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2018-09-05
  • 2014-08-30
  • 2014-02-02
相关资源
最近更新 更多