2012-07-06 10 views
16

私のテストでは、anonymous variables(値がわからない変数)を作成するJavaツールを探していますが、これは.NetのAutoFixtureと似ています。ここにはAutoFixture's readmeへのリンクがありますが、それはそれが何をするかのかなり良い例を持っています。ここで PloehのAutoFixture for .NETに代わるJavaがありますか?

が短い例では、同じREADMEから取られる:

[TestMethod] 
public void IntroductoryTest() 
{ 
    // Fixture setup 
    Fixture fixture = new Fixture(); 

    int expectedNumber = fixture.CreateAnonymous<int>(); 
    MyClass sut = fixture.CreateAnonymous<MyClass>(); 
    // Exercise system 
    int result = sut.Echo(expectedNumber); 
    // Verify outcome 
    Assert.AreEqual<int>(expectedNumber, result, "Echo"); 
    // Teardown 
} 

は、Javaの世界では、このようなツールはありますか?

編集:

私はQuickCheckを試してみましたが、それは私が探していたもののような何かをするために管理しながら:

import net.java.quickcheck.Generator; 
import net.java.quickcheck.generator.PrimitiveGenerators; 
import net.java.quickcheck.generator.support.ObjectGeneratorImpl; 

public class Main { 

interface Test{ 
    String getTestValue(); 
} 

public static void main(String[] args) { 
    Generator<String> stringGen = PrimitiveGenerators.strings(5, 100); 
    Generator<Integer> intGen = PrimitiveGenerators.integers(5, 20); 

    ObjectGeneratorImpl<Test> g = new ObjectGeneratorImpl<>(Test.class); 
    g.on(g.getRecorder().getTestValue()).returns(stringGen); 


    for (int i = 0; i < intGen.next(); i++) { 
     System.out.println("value of testValue is: " + g.next().getTestValue()); 
    } 
} 

} 

ツールは、インタフェースでのみ動作するようです。 Testをクラスに変更し、メソッドをフィールドに変更すると、ジェネレータはインターフェイスのみがサポートされているという例外をスローします。

私は真剣にドキュメントが真剣に欠けているので、何か良いことがあることを願っています。

+0

私は本当に私の正確な質問を見つけるとき、私はいつも大きな笑顔を持っています。 (私はコメントが多くの価値を追加しないことを知っている...) –

答えて

2

テストデータを生成するためのAPIを持っているQuickCheck、のJava実装があります:

http://java.net/projects/quickcheck/pages/Home

私はAutoFixtureとあまり慣れていないんだ、と私はQuickCheckは、テストの若干異なる種類であることを疑いますフレームワークですが、おそらくあなたの特定の問題を解決するのに便利です。

+0

ありがとう。ドキュメンテーションの不足は驚くほどですが、これは仕事をするように見えます。また、ドキュメンテーションはPOJOの生成をサポートすると主張していますが、これを実行しようとするとジェネレータは "Only interfaces supported"例外をスローします –

+0

@IvanAlagenchevええ、ドキュメントはあまり良くありません。あなたが望むクラスとフィールドのPOJO生成を行うカスタムジェネレータを構築しなければならないようです。これの例がここにあります:http://java.net/projects/quickcheck/sources/repository/content/quickcheck-examples/src/test/java/FileGeneratorTest.java –

1

ObjectGeneratorは実験的な機能の詳細です:

ObjectGenerator<Test> objects = PrimitiveGenerators.objects(Test.class); 
objects.on(objects.getRecorder().getTestValue()).returns(PrimitiveGenerators.strings()); 

Test next = objects.next(); 
System.out.println(next.getTestValue()); 

私は、単純なジェネレータの実装を好む:

class TestGenerator implements Generator<Test>{ 
    Generator<String> values = PrimitiveGenerators.strings(); 
    @Override public Test next() { 
     return new TestImpl(values.next()); 
    } 
} 
+0

ありがとう@トーマス・ジョン、私は先に進むつもりですこの複雑なクラスのアプローチ –

0

Yet Another QuickCheck for Javaあなたはおそらく見ても、別のツールです。

これはJUnitと非常に統合されています(パラメータを持つテスト、生成されたオブジェクトを設定する注釈などをサポートしています)。

多くのジェネレータ(すべてのクイックチェック、インターフェイス、抽象クラス、シングルトンジェネレータなどのOOP固有のもの)があり、独自のものを定義できます。コンストラクタベースのジェネレータもあります。

現在のところアルファステータスですが、downloads pageを見ると、基本的なドキュメントが表示されます。

+0

リンクに感謝します。私はそれを見て、私のプロジェクトでそれを使わないようにする2つのことがあります。最初のものは、大学の支援を受けているということです。私はそのようなプロジェクトを使用することについて非常に心配しています。大学院生が去った後は、通常は誰も維持する人はいません。 2つ目は、昨年4月から更新されていないことです。私は目を覚ますでしょうし、いくつかのアクティビティがある場合、私はQuickCheckのJava実装でそれを使うかもしれません。 –

3

イワン、

私はproject focused on reimplementing core features of AutoFixture in javaを開始しました。 AutoFixtureは確かに多くの機能を持っているので、最初に実装するものと、実装を気にしないものの優先順位を付ける必要があります。プロジェクトが始まったばかりなので、テスト、欠陥報告、機能要求を歓迎します。

5

githubにあり、maven centralに公開されているJFixtureもあります。

これはまだ開発中であり、機能要求は尊重されています。

私はそのために)( JFixture Mockitoに沿っ.spyを使用しています
+0

これは非常に有望に見えます! – Jan

1

;)

のは、それがAutoFixtureとC#との些細なことだろう何かをする方法の例を見てみましょう。ここでのアイデアは、特定の値を持つ必要のある特定のメソッドを除き、オブジェクト内にランダムなデータを生成することです。面白いことに、どこかに記載されていることが分かりません。このテクニックは、単体テストの「配置」部分を少数の行にすることを排除します。さらに、この単体テストに固有の値が

public class SomeClass { 
    public int id; //field I care 
    public String name; // fields I don't care 
    public String description; //fields I don't care 

    public int getId(){ 
     return id; 
    } 

    public void setId(int id){ 
     this.id = id; 
    } 

    public String getName(){ 
     return name; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getDescription(){ 
     return description; 
    } 

    public void setDescirption(String description){ 
     this.description = description; 
    } 
} 



public static void main(String args[]){ 
    JFixture fixture = new JFixture(); 
    fixture.customise().circularDependencyBehaviour().omitSpecimen(); //omit circular dependencies 
    fixture.customise().noResolutionBehaviour().omitSpecimen(); // omit methods that cannot be resolved 
    SomeClass entity = fixture.create(SomeClass.class); 
    SomeClass mock = Mockito.spy(entity); 
    Mockito.when(mock.getId()).thenReturn(3213); 

    System.out.println(mock.getId()); // always 3213 
    System.out.println(mock.getName()); // random 
    System.out.println(mock.getDescription()); //random 
} 

これが印刷されます。

3213 
name9a800265-d8ef-4be9-bd45-f0b62f791d9c 
descriptiona9f9245f-eba1-4805-89e3-308ef69e7091 
0

は、オブジェクトファクトリをお試しください。オープンソースのgithubです。単一行のコードでランダムなJavaオブジェクトを作成することができます。そしてそれは高度に設定可能です。

例:

ObjectFactory rof = new ReflectionObjectFactory(); 

String str = rof.create(String.class); 
Customer cus = rof.create(Customer.class); 

これは、Mavenの中央リポジトリにも使用可能です。

関連する問題