像Factory Girl这样的框架是否存在用于Java?[已关闭]

Factory Girl是一个方便的导轨框架,可以轻松创建用于测试的模型实例。

工厂女孩主页

factory_girl允许您快速定义每个模型的原型,并要求实例具有对手头测试很重要的属性。

一个示例(也来自主页):

Factory.sequence :email do |n|
    "somebody#{n}@example.com"
end

# Let's define a factory for the User model. The class name is guessed from the
# factory name.
Factory.define :user do |f|
    # These properties are set statically, and are evaluated when the factory is
    # defined.
    f.first_name 'John'
    f.last_name  'Doe'
    f.admin      false
    # This property is set "lazily." The block will be called whenever an
    # instance is generated, and the return value of the block is used as the
    # value for the attribute.
    f.email      { Factory.next(:email) }
end

如果我需要一个用户,可以打电话给

test_user = Factory(:user, :admin => true)

这将生成具有工厂原型中指定的所有属性的用户,除了我显式指定的管理属性。另请注意,电子邮件工厂方法每次调用时都会生成不同的电子邮件。

我认为在Java中实现类似的东西应该很容易,但我不想重新发明轮子。

P.S:我知道JMock和EasyMoc,但我在这里不是在谈论一个嘲笑框架。


答案 1

我还寻找了一个相当于Java的工厂女孩,但从未找到类似的东西。相反,我从头开始创建了一个解决方案。在Java中生成模型的工厂:模型公民

受 Factory Girl 的启发,它使用字段注释来设置模型的默认值,这是来自 wiki 的一个简单示例

@Blueprint(Car.class)
public class CarBlueprint {

    @Default
    String make = "car make";

    @Default
    String manufacturer = "car manufacturer";

    @Default
    Integer mileage = 100;

    @Default
    Map status = new HashMap();
}

这将是汽车模型的蓝图。这已注册到模型工厂中,然后可以按如下方式创建新实例:

ModelFactory modelFactory = new ModelFactory();
modelFactory.registerBlueprint( CarBlueprint.class );
Car car = modelFactory.createModel(Car.class);

您可以通过传入 Car 的实例而不是 Class 并根据需要设置值来覆盖 Car 模型的值:

Car car = new Car();
car.setMake( "mustang" );
car = modelFactory.createModel( car );

维基有更复杂的例子(例如使用@Mapped)和更多花里胡哨的细节。


答案 2

一个可能的库是篡夺者

但是,如果要指定正在创建的对象的属性,那么Java的静态类型化使框架变得毫无意义。您必须将属性名称指定为字符串,以便框架可以使用反射或 Java Bean 自省来查找属性访问器。这将使重构变得更加困难。

只需对对象进行全新设置并调用其方法就简单得多。如果要避免在测试中使用大量样板代码,测试数据生成器模式可以提供帮助。


推荐