测试工厂行为

时间:2012-07-09 13:57:17

标签: java unit-testing factory-pattern

我想知道测试工厂行为代码的最佳做法是什么。在我的例子中,工厂创建了一些将传递给FooBar实例的构造函数的依赖实例。

public class FooBarFactory {
  private Dependency1 dependency1;
  private Dependency2Factory factory;

  public FooBarFactory(Dependency1 dependency1, Dependency2Factory factory) {
    this.dependency1 = dependency1;
    this.factory = factory;
  }

  public FooBar create() {
    return new FooBar(dependency1, factory.create(), new Dependency3());
  }
}

依赖关系可以由其他一些工厂创建,也可以由被测工厂直接创建。

为了测试工厂行为,我现在要做的是在FooBar中创建一些受保护的getter以检索依赖项,这样我就可以断言构造函数注入并正确创建依赖项。

这是我不确定的地方。为测试目的添加一些吸气剂困扰我一点,因为它破坏了封装。我也可以使用反射来检索字段值,但我通常会考虑这种不好的做法,因为它很容易破解。

任何人都可以提供有关此问题的见解吗?

4 个答案:

答案 0 :(得分:1)

一种解决方案是模拟FooBar类并验证构造函数调用,通过该调用创建FooBarFactory#create()返回的实例。使用JMockit模拟API,这样的测试看起来像:

public class FooBarFactoryTest
{
    @Injectable Dependency1 dep1;
    @Injectable Dependency2 dep2;
    @Cascading @Injectable Dependency2Factory dep2Factory;
    @Mocked FooBar mockFooBar;
    @Tested factory;

    @Test
    public void createFooBarWithProperDependencies()
    {
        assertNotNull(factory.create());

        new Verifications() {{ new FooBar(dep1, dep2, (Dependency3) withNotNull()); }};
    }
}

答案 1 :(得分:0)

作为一个单元测试,你应该测试你的单元(类)和这个。

工厂内工厂创建的值应在其单元测试中进行测试。例如,根据您的情况,测试dependency2Factory返回的内容没有意义,因为为了FooBar工作,Dependency2Factory也应该有效(如果它不可配置) ,如果它是可配置的,你可以提供自己的模拟,这就足够了。

Dependency2Factory应该在单独的单元测试中进行测试。

每次在实施中使用列表时,您都不会测试方法List.get(int index)是否有效吗?

答案 2 :(得分:0)

我认为我想到的建议是依次注入FooBarFactory的依赖项,因此它将Dependency1和Dependency2Factory作为构造函数参数或setter方法中的值。

答案 3 :(得分:0)

嘲笑怎么样?模拟运行经过测试的代码所需的每个依赖项。 有一些很好的模拟框架,比如mockito。