首页 > 解决方案 > 模拟单元测试和工厂

问题描述

假设我有一个需要测试的 C 类。它的部分工作是创建许多其他重要的类对象(每个都有自己的业务逻辑)并在这些新对象上调用各种方法。我希望能够在不测试 C 创建的其他对象的实现的情况下测试 C 类。唯一真正的解决方案是创建一个创建那些非平凡对象的工厂,然后将一个模拟的工厂实例传递给测试?我不想有一个工厂来创建那些其他重要的对象,但另一方面我不想每个非平凡的类都有一个工厂。

还有其他建议吗?

编辑:根据要求添加了一些伪代码

public B doIt()
{
  List<A> as = getListOfAsFromDatabase();
  AParser AParser = new AParser();
  boolean foo = aParser.parse(as); // may modify the list of A's
  B b = new B();
  return b.add(foo, as);
}

标签: javaunit-testingmocking

解决方案


如果依赖对象创建是在成员级别,我们可以使用 Mockito 和 PowerMock 来创建模拟和更新成员模拟依赖。我正在使用静态内部类来简化此操作,此解决方案也适用于常规类。

public class Test1 {
    @Test
    public void test() {
        B mockedb = org.mockito.Mockito.mock(B.class);
        A a = new A();
        org.powermock.reflect.Whitebox.setInternalState(a, "b", mockedb);
        a.exe();
    }

    public static class A {
        private B b = new B();

        public void exe() {
            List<String> l = new ArrayList<>();
            l.add("a");
            b.exeB(l);
            System.out.println(l);
        }

        public static class B {
            public void exeB(List<String> s) {
                s.add("b");
            }
        }

    }

}

推荐阅读