我想知道测试工厂行为代码的最佳做法是什么。在我的例子中,工厂创建了一些将传递给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以检索依赖项,这样我就可以断言构造函数注入并正确创建依赖项。
这是我不确定的地方。为测试目的添加一些吸气剂困扰我一点,因为它破坏了封装。我也可以使用反射来检索字段值,但我通常会考虑这种不好的做法,因为它很容易破解。
任何人都可以提供有关此问题的见解吗?
答案 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。