28

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)

これにより、明示的に指定したadminプロパティを除いて、ファクトリプロトタイプで指定されたすべてのプロパティを持つユーザーが生成されます。また、電子メールファクトリメソッドは、呼び出されるたびに異なる電子メールを生成することに注意してください。

Javaに似たようなものを実装するのはかなり簡単なはずだと思いますが、車輪の再発明はしたくありません。

PS:私はJMockとEasyMocの両方について知っていますが、ここではモックフレームワークについて話していません。

4

6 に答える 6

22

また、Factory Girl に相当する Java を探しましたが、そのようなものは見つかりませんでした。代わりに、ゼロからソリューションを作成しました。Java でモデルを生成するためのファクトリ: Model Citizen

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();
}

これは、Car モデルのブループリントになります。これは ModelFactory に登録され、次のように新しいインスタンスを作成できます。

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

クラスの代わりに Car のインスタンスを渡し、必要に応じて値を設定することで、Car モデルの値をオーバーライドできます。

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

wikiには、より複雑な例 ( @Mapped の使用など) と、さらにいくつかの付加機能の詳細があります。

于 2012-09-04T06:38:08.540 に答える
8

これを行うための 1 つの可能なライブラリはUsurperです。

ただし、作成しているオブジェクトのプロパティを指定したい場合、Java の静的型付けではフレームワークが無意味になります。フレームワークがリフレクションまたは Java Bean イントロスペクションを使用してプロパティ アクセサーを検索できるように、プロパティ名を文字列として指定する必要があります。これにより、リファクタリングがはるかに困難になります。

オブジェクトを新しくして、それらのメソッドを呼び出す方がはるかに簡単です。テストで大量のボイラープレート コードを避けたい場合は、Test Data Builderパターンが役立ちます。

于 2009-06-14T18:52:34.800 に答える
2
  1. これが万人向けではないことは理解していますが、Java コードに対して Ruby テスト コードを作成することはできます。(JTestR)
  2. Java でこれを行うための推奨される方法は、Test Data Builderパターンを使用することです。このアプローチは、フレームワークや外部依存関係の複雑さを導入することを正当化するものではないと私は主張します。フレームワークを使用して指定を大幅に減らして、それ以上のものを得る方法がわかりません... Builder 構文は、FactoryGirl 構文と本質的に同等です。(誰かが私を納得させてください!)
于 2009-06-13T18:18:55.530 に答える
1

私はこれがまさにあなたが探しているものではないことを知っています...

私は過去に、リフレクションを使用して Bean の値を入力するコードをいくつか書きました。基本的な考え方は、すべてのセッターを見つけて、ダミー値でそれぞれを呼び出すことです。私のバージョンでは、フィールドsetNameの名前としてすべての文字列を設定し、「name」で呼び出され、すべてのintを1、ブール値をtrueなどに設定します.

次に、これを Object Mother や Test Data Builder に似たパターンと組み合わせて使用​​しました。

これはテスト データの良いスタートとなり、特定の値を必要とするフィールドはテストの一部として明示的に設定できました。

お役に立てれば。

于 2009-06-14T17:08:02.213 に答える
-3

モデル オブジェクトが単純な場合、フレームワークを使用してそれらを作成する理由はありません。単に「new」演算子を使用するだけです。複雑なモデル (複雑な関係) がある場合は、Spring を使用してそれらをバインドできます (テスト シナリオでも Spring を使用できます)。

  • ただし、これは単なるデータ オブジェクト用です。何かを実行しているオブジェクトのインスタンス化について話している場合は、実際のインスタンスを使用する代わりに外部リレーションシップをモック/スタブすることをお勧めします。
于 2009-06-12T13:09:06.033 に答える