java - 模拟在单元测试期间尝试调用方法,但实际上并不调用它

标签 java methods junit mocking call

我正在编写 JUnit 测试并使用 Mockito,我想调用一个方法,该方法又多次调用第二个方法。我不希望在我的单元测试期间调用第二种方法,但我想知道它的参数是什么。我要测试的代码看起来像这样:

public class MyClass {
    public void myMethod() {
        int a = [do some logic]
        int b = [do some logic];
        doSomething(a, b);

        a = [do some logic];
        b = [do some logic];
        doSomething(a, b);
    }

    public void doSomething(int a, int b) {
        // code that I do not want to be executed during a unit test
    }
}

现在是单元测试:

@Test
public void test() {
    MyClass myClass = new MyClass();
    myClass.myMethod();
    verify(myClass).doSomething(17, 33);
    verify(myClass).doSomething(9, 18);
}

我是 Mockito 的新手,我不知道是否可以 A) 阻止执行 doSomething() 和 B) 验证 a 和 b 参数的值。我愿意接受诸如“Mockito 无法在此处帮助您”或“这在技术上是不可能的”之类的回答。如果没有办法模拟这种事情,我可能会考虑将那些[做一些逻辑] block 重构为我可以直接测试的方法但是我的代码比这个简单的例子更复杂,而且我不允许在线发布代码.

最佳答案

spy 很丑。如果你部分地模拟你的被测类,你很容易混淆什么是模拟的,什么是真正测试的。 Mockito 的 Javadoc 明确警告不要进行部分模拟。

最好重构你的代码,这样你就可以干净地测试它。将 doSomething() 提取到一个新类中:

public class SomethingDoer {
    public void doSomething(int a, int b) {
        // code that you do not want to be executed during a unit test
    }
}

更改了我的类:

public class MyClass {
    private final SomethingDoer somethingDoer;

    public MyClass(SomethingDoer somethingDoer) {
        this.somethingDoer = somethingDoer;
    }

    public void myMethod() {
        int a = [do some logic]
        int b = [do some logic];
        somethingDoer.doSomething(a, b);

        a = [do some logic];
        b = [do some logic];
        somethingDoer.doSomething(a, b);
    }
}

测试:

@Test
public void test() {
    SomethingDoer somethingDoer = mock(SomethingDoer.class);
    MyClass myClass = new MyClass(somethingDoer);
    myClass.myMethod();
    verify(somethingDoer).doSomething(17, 33);
    verify(somethingDoer).doSomething(9, 18);
}

关于java - 模拟在单元测试期间尝试调用方法,但实际上并不调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9122510/

相关文章:

java - 我应该编译哪个版本的 Android 以避免内部类警告

java - Bad Base - 尝试发送图像时出现 64 错误

ruby-on-rails - 如何将多个参数作为数组传递给 ruby​​ 方法?

php - 列出给定类的所有方法,不包括 PHP 中父类的方法

c++ - 能否获取成员函数模板参数的所属对象?

android - 告诉 Espresso 在模拟器上运行特定测试

android - 模拟 FirebaseRemoteConfig getBoolean()

java - 未知配置格式: hocon (supported formats are: [json,原始,属性]

java - 如何在 Windows 中通过命令提示符运行 Junit.Jupiter 代码

java - 如何在JTable(JAVA)中显示FK ID的引用