Domanda

C'è un modo per deridere oggetto la costruzione, utilizzando JMock in Java?

Per esempio, se ho un metodo come tale:

public Object createObject(String objectType) {
    if(objectType.equals("Integer") {
        return new Integer();
    } else if (objectType.equals("String") {
        return new String();
    }
}

...c'è un modo per deridere il attesa della costruzione di oggetti in un metodo di prova?

Mi piacerebbe essere in grado di collocare le aspettative che alcuni costruttori sono chiamati, invece di avere un po ' di codice per controllare il tipo (come non sempre essere così contorto e semplice come il mio esempio).

Così, invece di:

assertTrue(a.createObject() instanceof Integer);

Potrei avere un'aspettativa di certo costruttore chiamato.Solo per fare un po ' più pulita, e di esprimere ciò che è effettivamente in fase di test in un modo più leggibile.

Vi prego di scusare il semplice esempio, il vero problema a cui sto lavorando è un po ' più complicato, ma avendo l'aspettativa sarebbe di semplificare.


Per un po ' più di fondo:

Ho un semplice metodo factory, che crea oggetti wrapper.Gli oggetti di essere avvolto possibile richiedere dei parametri che sono difficili da ottenere in una classe di test (è pre-esistente), del codice), quindi è difficile per la loro costruzione.

Forse più vicino a quello che sto cercando è:c'è un modo per deridere un'intera classe (utilizzando CGLib) in un colpo solo, senza specificare ogni metodo di stub?

Così il mock è di essere avvolto in un costruttore, quindi ovviamente i metodi possono essere chiamati su di esso, è JMock in grado di dinamicamente beffardo ogni metodo?

La mia ipotesi è no, come sarebbe piuttosto complicato.Ma sapendo sto abbaiare contro l'albero sbagliato è troppo preziosi :-)

È stato utile?

Soluzione

L'unica cosa che posso pensare è quello di avere il metodo create al di fabbrica oggetto, che di finto.

Ma in termini di beffardo una chiamata al costruttore, no.Gli oggetti Mock presuppongono l'esistenza dell'oggetto, mentre un costruttore presuppone che l'oggetto non esiste.Almeno in java dove allocazione e inizializzazione accadere insieme.

Altri suggerimenti

jmockit può fare questo.

Vedi la mia risposta in https://stackoverflow.com/questions/22697#93675

Ahimè, penso che io sono colpevole di porsi la domanda sbagliata.

La fabbrica semplice, stavo cercando di prova sembrava qualcosa come:

public Wrapper wrapObject(Object toWrap) {
    if(toWrap instanceof ClassA) {
        return new Wrapper((ClassA) toWrap);
    } else if (toWrap instanceof ClassB) {
        return new Wrapper((ClassB) toWrap);
    } // etc

    else {
        return null;
    }
}

Mi ponevo la domanda su come trovare se "nuovo ClassAWrapper( )" è stato chiamato perché l'oggetto toWrap era difficile da ottenere in una prova isolata.E il wrapper (se si può ancora essere chiamato così) è un po ' strano, in quanto utilizza la stessa classe per avvolgere oggetti diversi, utilizza solo i costruttori diversi[1].Ho il sospetto che se avessi fatto la domanda un po ' meglio, mi hanno subito ricevuto la risposta:

"Si dovrebbe mock toWrap per abbinare i casi si stanno verificando in diversi metodi di prova, e ispezionare la risultante oggetto Wrapper per trovare il tipo corretto è tornato...e spero che tu sia abbastanza fortunato che non hai, per deridere il mondo per creare le diverse istanze ;-)"

Ora ho un ok soluzione al problema immediato, grazie!

[1] aprendo la domanda se questo deve essere rielaborato, è ben al di fuori della portata del mio attuale problema :-)

Hai familiarità con L'Iniezione Di Dipendenza?

Se no, allora si ceartanly sarebbe beneficiare di apprendimento su tale concetto.Credo che il buon vecchio Inversione di Contenitori di Controllo e l'Iniezione di Dipendenza modello da Martin Fowler servirà come una buona introduzione.

Con la Dependency Injection (DI), si avrebbe un contenitore DI oggetti, che è in grado di creare tutti i tipi di classi per voi.Quindi l'oggetto sarebbe fare uso di la DI contenitore per instanciate classi e si avrebbe finto DI contenitore a prova che la classe crea istanze del previsto classi.

L'Iniezione di dipendenza o di Inversione del Controllo.

In alternativa, utilizzare l'Abstract Factory design pattern per tutti gli oggetti che si crea.Quando si sono Unità in modalità di Prova, iniettare un Test di Fabbrica che vi dirà che cosa ti stai creando, quindi include anche l'affermazione di codice nel Test di Fabbrica per controllare i risultati (inversion of control).

Per lasciare il tuo codice più pulito possibile creare un interno interfaccia protetta, implementare l'interfaccia (la fabbrica) con il codice di produzione come una classe interna.Aggiungere una variabile statica tipo di interfaccia inizializzazione di default di fabbrica.Aggiungere statico setter per la fabbrica e si è fatto.

Nel codice di test (deve essere nello stesso pacchetto, altrimenti l'interfaccia interna deve essere pubblico), creare un anonimo o classe interna, con l'affermazione di codice e il codice di test.Poi nel tuo test, inizializzare la classe di destinazione, assegnare (iniettare) il test di fabbrica, e di eseguire i metodi del vostro target di classe.

Io spero che non ci sia nessuno.Le simulazioni sono supposti per farsi beffe di interfacce, che non hanno i costruttori...solo i metodi.

Qualcosa sembra essere mancante il tuo approccio alla prova qui.Un motivo per il quale è necessario verificare che esplicita i costruttori sono chiamati ?
Affermare il tipo di oggetto restituito sembra ok per il test di fabbrica implementazioni.Il trattamento createObject come una blackbox..esaminare ciò che ritorna, ma non gestire come farlo.A nessuno piace che :)

Aggiornamento dell'Aggiornamento: Ouch!Misure disperate per momenti di disperazione, eh?Sarei sorpreso se JMock permette che...come ho detto funziona su interfacce..non calcestruzzi.Così

  • Provare e spendere un po ' di sforzo su come ottenere quei fastidiosi oggetti di input 'istanze' sotto test harness.Andare a Fondo nel vostro approccio.
  • Se questo non è fattibile, verificare manualmente che con i punti di interruzione (so che fa schifo).Poi attaccare un "Tocco a proprio rischio" commento in una zona visibile nel file di origine e andare avanti.Combattere un altro giorno.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top