有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Mockito测试此方法?

我有一个在不同对象之间进行复杂交互的方法,我想使用Mockito框架来测试它。我希望有一些指导方针。我知道代码没有多大意义

两个getInstance()方法都是静态的。我想模拟obj3并使if语句在测试中返回true

public MyRequest getRequest(ObjectOne obj1, ObjectTwo obj2) {

    ObjectThree obj3 = FactoryOne.getInstance().getList().getObject(obj2.getId());


    if(FactoryTwo.getInstance().isFlagSet("flag")){
        ....
    }


    return new MyRequest(....);
}

共 (1) 个答案

  1. # 1 楼答案

    实际上,为obj3变量赋值而调用的方法是不可直接测试的

    根本原因是getInstance()这是一种静态方法

    事实上,FactoryOne.getInstance()应该是被测试类的依赖项,返回的对象应该是接口

    通过这种方式,您可以定义设置依赖项的构造函数:

    public MyClass(FooInterface foo){
       this.foo = foo;
    }
    

    并替换:

    ObjectThree obj3 = FactoryOne.getInstance().getList().getObject(obj2.getId());
    

    作者:

    ObjectThree obj3 = foo.getList().getObject(obj2.getId());
    

    在应用程序代码中,可以调用构造函数:

    MyClass c = new MyClass(FactoryOne.getInstance().getList());
    

    在测试代码中,您可以为Foo接口创建一个模拟,通过构造函数将其设置为测试下的类:

    Foo fooMock = Mockito.mock(Foo.class);
    MyClass myClassUnderTest = new MyClass(fooMock);
    

    然后记录getList()的模拟行为,以返回另一个模拟对象,该对象具有在测试中调用getObject()所需的值