2012-07-06 11 views
16

Sto cercando uno strumento Java che creerebbe anonymous variables (variabili di cui non mi interessa il valore) nei miei test, simile a AutoFixture in .Net. Ecco un collegamento a AutoFixture's readme, che ha esempi abbastanza buoni di ciò che fa.Esiste un'alternativa Java a AutoFixture di Ploeh per .Net?

Ecco un breve esempio tratto dalla medesima 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 
} 

C'è un tale strumento nel mondo Java?

Edit:

ho provato QuickCheck e mentre è riuscito a fare qualcosa di simile a quello che stavo cercando:

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

} 

Lo strumento sembra funzionare solo con le interfacce. Se cambio Test come classe e metodo su un campo, il generatore genera un'eccezione che supporta solo le interfacce.

Spero sinceramente che ci sia qualcosa di meglio, soprattutto perché la documentazione è seriamente carente.

+0

Ho sempre un grande sorriso quando trovo la mia domanda esatta su SO. (So ​​che il commento non aggiunge molto valore ...) –

risposta

2

C'è un'implementazione Java di QuickCheck, che ha le API per la generazione di dati di test:

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

Io non sono troppo familiarità con AutoFixture, e ho il sospetto che QuickCheck è un po 'diverso tipo di prova quadro, ma forse è utile per risolvere il tuo problema specifico.

+0

Grazie. Sembra che farebbe il lavoro, anche se la mancanza di documentazione è spaventosa. Inoltre, la documentazione afferma di supportare la generazione POJO, ma quando provo a farlo, il generatore genera un'eccezione "Solo interfacce supportate" –

+0

@IvanAlagenchev sì, la documentazione non è molto buona. Sembra che tu debba costruire un generatore personalizzato per fare il tipo di generazione POJO di classi e campi che desideri. C'è un esempio di questo qui: http://java.net/projects/quickcheck/sources/repository/content/quickcheck-examples/src/test/java/FileGeneratorTest.java –

1

ObjectGenerator è più di una funzione sperimentale:

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

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

Preferirei una semplice implementazione Generatore:

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

Grazie @Thomas Jung, andrò avanti con questo approccio per classi complesse –

0

Yet Another QuickCheck for Java è un altro strumento, probabilmente si può dare un'occhiata.

È molto integrato con JUnit (supporta test con parametri, annotazioni per configurare gli oggetti generati e così via).

Ha un sacco di generatori (tutti di quickcheck e alcuni specifici di OOP, come interfacce, classi astratte e generatori singleton), e puoi definire i tuoi. C'è anche un generatore basato su costruttore.

Attualmente è in stato alfabetico, ma se dai un'occhiata allo downloads page vedrai una documentazione di base.

+0

grazie per il collegamento. Ho dato un'occhiata a questo e ci sono due cose a riguardo che mi terranno lontano dall'usarlo nei miei progetti. Il primo è che è supportato da un'università - sono piuttosto preoccupato dell'uso di tali progetti. Di solito non c'è nessuno da mantenere dopo la partenza dello studente. Il secondo è che non è stato aggiornato da aprile dello scorso anno. Terrò un occhio però e se c'è qualche attività potrei andare con esso sopra l'implementazione java di QuickCheck. –

3

Ivan,

ho iniziato un project focused on reimplementing core features of AutoFixture in java. La correzione automatica ha sicuramente molte caratteristiche, quindi ho bisogno di dare la priorità a quelle da implementare per prime e quali non disturbare affatto l'implementazione. Poiché il progetto è appena iniziato, accolgo test, rapporti sui difetti e richieste di funzionalità.

5

C'è anche JFixture che è disponibile su github e pubblicato su maven central.

Questo è ancora in fase di sviluppo attivo e le richieste di funzionalità sono state rispettate.

+0

Questo sembra molto promettente! – Jan

1

Sto usando JFixture lungo Mockito .spy() per questo;)

Vediamo un esempio come fare qualcosa che sarebbe stato banale con AutoFixture e C#. L'idea qui è di generare dati casuali nel tuo oggetto ad eccezione di alcuni metodi specifici che devono avere valori specifici. È interessante che non l'abbia trovato da qualche parte. Questa tecnica elimina la parte "Disponi" dei tuoi test unitari in un numero limitato di linee e inoltre si concentra su quali valori devono essere specifici per il test di questa unità per passare

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 
} 

Questo stampa:

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

Prova oggetto di fabbrica. È open source su github. Può creare oggetti Java casuali in una sola riga di codice. Ed è altamente configurabile.

Esempio:

ObjectFactory rof = new ReflectionObjectFactory(); 

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

E 'disponibile in Maven centrale Repository anche.

Problemi correlati