【问题标题】:Java - Calling private functions of a class from mock of public function in the classJava - 从类中的公共函数的模拟中调用类的私有函数
【发布时间】:2017-05-23 13:05:16
【问题描述】:


我正在寻找一种方法来测试处理数据的类中的数据,然后以尽可能干净和可移植的方式上传数据。所以我不想诉诸于公开获取功能,以避免任何能够访问这些数据的东西。为了保持它的可移植性,我想避免使用测试数据库,以便可以在任何情况下运行这些测试。

Class Foo {     
    private int a;
    private int b;
    private int c;
    private DBSaver dbSaver;

    public Foo(DBSaver dbSaver) {       
        this.dbSaver = dbSaver;
    }

    public void processData() {           
        processData();
        saveToDB();
    }

    private void workNumbers() {     
        a = 1;
        b = 2;
        c = a + b;
    }

    private void saveToDB() {           
        List<Integer> list = new ArrayList<>();
        list.add(a); list.add(b); list.add(c);
        dbSaver.save(list);
    }
}

测试类:

class FooTest {       
    @Mock
    DBSaver dbSaver;
    @Mock
    Foo foo;

    @Test
    private void test() {when(dbSaver.save(any(ArrayList<>.class))).then(returnsFirstArg());
        foo = new Foo(dbSaver);
        Mockito.doThrow(new Exception() {
                //Now I would like to get a, b and c so I can ensure that they have the proper values.
            }
            ).when(foo).processData();
    }
}

Here 是代码的 pastebin 版本]()。

workNumbers() 将正常执行,并且由于 save() 函数已被模拟为什么都不做,因此该代码不会做任何太严重的事情。

我想问一下现在是否有一种方法可以通过模拟抛出的异常来以列表形式获取 a、b 和 c 值。问题是通过 FooTest 中的模拟实例访问 Foo 中的私有值。

【问题讨论】:

    标签: java mocking


    【解决方案1】:

    您正在通过模拟错误进行单元测试。这样做没有意义:

    @Mock
    Foo foo;
    

    Foo 是您的“被测类”。你确实想嘲笑它。如果有的话,您可能想在这里创建一个 spy,以便执行 partial mocking

    在您的情况下,您不需要访问这些私有字段。你看,关键是你的代码会调用:

    dbSaver.save(list);
    

    在某个时候。含义:您可以使用 Mockitoy 来验证在该 mocked dbSaver 对象上调用 save() 时是否传递了特定列表。

    这就是重点:您拥有模拟的 dbSaver 实例,因此您可以完全控制那里发生的事情。如前所述,您可以验证它的方法是使用特定参数调用的;或者您甚至可以使用 ArgumentCaptor 来访问传递给该方法调用的列表。

    然后您只需确保列表包含 预期 内容(这将是您的测试类中的这三个值!)。看 here 举例说明如何做到这一点。

    最后:尤其是“异常”部分确实是错误的。这里不需要生成异常。您只需将模拟的 dbSaver 推送到 Foo 的实例中,然后调用该 Foo 实例上的方法;然后检查预期的结果。而已;其他任何事情都是(无用的)过于复杂的事情。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2011-05-27
    相关资源
    最近更新 更多