24

.Net の AutoFixture と同様に、テストで匿名変数(値を気にしない変数)を作成する Java ツールを探しています。AutoFixture の readmeへのリンクを次に示します。ここには、それが何をするかのかなり良い例があります。

以下は、同じ 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());
    }
}

}

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

特にドキュメントが深刻に不足しているため、より良いものがあることを心から願っています。

4

7 に答える 7

8

githubで利用可能で、 maven centralに公開されている JFixture もあります。

これはまだ活発に開発されており、機能のリクエストは受け入れられています。

于 2015-06-09T12:13:36.107 に答える
3

オブジェクトファクトリを試してください。githubでオープンソース化されています。たった 1 行のコードでランダムな Java オブジェクトを作成できます。そして、それは高度に構成可能です。

例:

ObjectFactory rof = new ReflectionObjectFactory();

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

Maven Central Repository でも利用できます。

于 2015-11-10T21:57:33.170 に答える
3

そのために、 Mockito .spy() に 沿ってJFixtureを使用しています;)

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
于 2015-10-03T13:39:09.230 に答える
2

テスト データを生成するための API を備えた QuickCheck の Java 実装があります。

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

私は AutoFixture にあまり詳しくありません。また、QuickCheck は少し異なる種類のテスト フレームワークであると思いますが、特定の問題を解決するのに役立つかもしれません。

于 2012-07-06T19:26:13.877 に答える
2

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());
    }   
}
于 2012-07-11T08:33:54.053 に答える
0

Yet Another QuickCheck for Javaは、おそらく検討する可能性のあるもう 1 つのツールです。

JUnit と非常に統合されています (パラメーターを使用したテスト、生成されたオブジェクトを構成するための注釈などをサポートしています)。

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

現在はアルファ版の状態ですが、ダウンロード ページを見ると、基本的なドキュメントが表示されます。

于 2012-07-12T00:09:34.693 に答える