2012-07-06 14 views
16

Ich bin auf der Suche nach einem Java-Tool, das anonymous variables (Variablen, deren Wert ich interessiere nicht) in meinen Tests, ähnlich wie AutoFixture in .Net erstellen würde. Hier ist ein Link zu AutoFixture's readme, der ziemlich gute Beispiele dafür hat, was es tut.Gibt es eine Java-Alternative zu Ploehs AutoFixture für .Net?

ist hier ein kurzes Beispiel aus dem gleichen readme genommen:

[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 
} 

Gibt es ein solches Werkzeug in der Java-Welt?

Edit:

Ich habe versucht, Quick Check und während es so etwas wie zu tun geschafft, was ich suchte:

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

} 

Das Tool scheint nur mit Schnittstellen zu arbeiten. Wenn ich Test zu einer Klasse und die Methode zu einem Feld ändere, löst der Generator eine Ausnahme aus, die nur Schnittstellen unterstützt.

Ich hoffe aufrichtig, dass es etwas besseres gibt, vor allem, weil die Dokumentation ernsthaft fehlt.

+0

Ich habe immer ein großes Lächeln, wenn ich meine genaue Frage zu SO finde. (Ich weiß, dass der Kommentar nicht viel Wert hinzufügen ...) –

Antwort

2

Es ist eine Java-Implementierung von Quick Check, die APIs zur Erzeugung von Testdaten hat:

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

Ich bin nicht allzu vertraut mit AutoFixture, und ich vermute, dass Quick Check eine etwas andere Art von Test ist Rahmen, aber vielleicht ist es nützlich, um Ihr spezifisches Problem zu lösen.

+0

Danke. Dies scheint so zu sein, als würde es den Job erledigen, obwohl das Fehlen von Dokumentation entsetzlich ist. Auch die Dokumentation behauptet, POJO-Generierung zu unterstützen, aber wenn ich das versuche, löst der Generator eine Ausnahme aus "Nur Schnittstellen unterstützt" –

+0

@IvanAlagenchev Ja, die Dokumentation ist nicht sehr gut. Es sieht so aus, als müssten Sie einen benutzerdefinierten Generator erstellen, um die gewünschte POJO-Generation von Klassen und Feldern zu erstellen. Es gibt ein Beispiel dafür: http://java.net/projects/quickcheck/sources/repository/content/quickcheck-examples/src/test/java/FileGeneratorTest.java –

1

ObjectGenerator ist eher eine experimentelle Funktion:

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

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

ich einen einfachen Generator Implementierung bevorzugen würden:

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

Danke @Thomas Jung, ich werde weitermachen Dieser Ansatz für komplexe Klassen –

0

Yet Another QuickCheck for Java ist ein weiteres Werkzeug, das Sie wahrscheinlich einen Blick darauf werfen kann.

Es ist sehr in JUnit integriert (es unterstützt Tests mit Parametern, Anmerkungen zur Konfiguration der generierten Objekte und so weiter).

Es hat viele Generatoren (alle Quickcheck und einige spezifische OOP, wie Schnittstellen, abstrakte Klassen und Singleton-Generatoren), und Sie können Ihre eigenen definieren. Es gibt auch einen Konstruktor-basierten Generator.

Derzeit ist im Alpha-Status, aber wenn Sie einen Blick auf die downloads page werfen, werden Sie eine grundlegende Dokumentation sehen.

+0

danke für den Link. Ich habe es mir angeschaut und es gibt zwei Dinge, die mich davon abhalten, es in meinen Projekten zu verwenden. Das erste ist, dass es von einer Universität unterstützt wird - ich bin ziemlich nervös, solche Projekte zu benutzen. Es gibt normalerweise niemanden, den man nach dem Ablegen des Studenten behalten kann. Die zweite ist, dass es seit April letzten Jahres nicht aktualisiert wurde. Ich behalte aber ein Auge und wenn es etwas Aktivität gibt, könnte ich damit über die Java-Implementierung von QuickCheck gehen. –

3

Ivan,

begann ich eine project focused on reimplementing core features of AutoFixture in java. AutoFixture hat sicherlich viele Funktionen, daher muss ich priorisieren, welche zuerst implementiert werden sollen und welche überhaupt nicht umgesetzt werden sollen. Da das Projekt gerade gestartet wird, freue ich mich auf Tests, Fehlerberichte und Feature-Anfragen.

5

Es gibt auch JFixture, die auf github verfügbar ist und maven central veröffentlicht.

Dies ist immer noch in der Entwicklung, und Feature-Anfragen werden geehrt.

+0

Das sieht sehr vielversprechend aus! – Jan

1

Ich bin mit JFixture entlang Mockito .spy() für das;)

Lassen Sie uns ein Beispiel sehen, wie etwas zu tun, dass es mit AutoFixture und C# trivial sein würde. Die Idee hier ist, zufällige Daten in Ihrem Objekt zu generieren, mit Ausnahme einiger spezifischer Methoden, die bestimmte Werte haben müssen. Es ist interessant, dass ich nicht gefunden habe, dass irgendwo angegeben. Diese Technik beseitigt den "Anordnen" Teil Ihrer Unit-Tests, um eine kleine Anzahl von Linien zu sein und konzentriert sich darüber hinaus, welche Werte spezifisch sein müssen, um diesen Unit-Test

zu bestehen
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 
} 

Diese Drucke:

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

Try Objekt Fabrik. Es ist Open Source unter github. Es kann zufällige Java-Objekte in nur einer einzigen Codezeile erstellen. Und es ist in hohem Maße konfigurierbar.

Beispiel:

ObjectFactory rof = new ReflectionObjectFactory(); 

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

Es ist auch in Maven Zentrales Repository zur Verfügung.

Verwandte Themen