首页 > 解决方案 > Mockito - 模拟依赖而不注入

问题描述

我整天都在看论坛试图模拟一个类,但没有一个解决方案对我有用,而且我不知道我做错了什么(我是 Java 测试的新手)。

我有我想测试的这个(重命名的)类,主要是每个 if 条件以确保它们工作:

public class MyClass {
    public static List<Object> MyClass(@NotNull Session session, @NotNull MyObject updated, @NotNull Mode mode)
    throws Exception {
        ModeList modes = MyUtil.geModes(mode);

        try {
            final Transaction tr = updated.getTransaction();
            MyObject original;

            if(tr == null) {
                original = new Foo().getCurrentBar(session, updated.getKey(), null, "en");
            } else {
                original = new Foo().getOtherBar(session,
                                                 updated.getKey(),
                                                 tr.getProp1().intValue(),
                                                 tr.getProp2().intValue(),
                                                 "en");
            }

            return SomeClass.check(updated, original, modes);
        } catch (Exception ex) {
            // handle
        }

        return null;
    }
}

请注意,我无法更改此(或 Foo 类)/添加依赖注入,它需要按原样进行测试。我尝试过 mockito、powerMock mock、mockStatic、partial mocks 等,它们都因某种原因而失败,而真正的 getCurrentBar / getOtherBar 被调用。

在这一点上我可能会得到隧道视野,但请告知。

标签: javamockitopowermock

解决方案


这段代码是错误的,它应该使用工厂来获取 Foo,所以你可以模拟工厂。但既然你不能修改它,那么下一个最好的方法是使用 PowerMock。

您可以遵循本指南:https ://github.com/powermock/powermock/wiki/MockConstructor确保不要忘记 @RunWith 和 @PrepareForTest 注释。


推荐阅读