2009-06-17 21 views
8

Per scopi di test dell'unità, sto cercando di scrivere un mock object di una classe senza costruttori.È possibile estendere una classe senza costruttori in Java?

E 'anche possibile in Java, la classe semplicemente non è estensibile?

+2

La domanda era: può essere derisa, non può essere sottoclasa, data la risposta accettata, forse dovresti cambiare la domanda se è questo che intendevi? – Yishai

+0

Le mie domande si interroga chiaramente sull'estensibilità. Si parla solo di derisione come motivo per desiderare questa estensibilità. –

risposta

18

Una classe senza costruttori ha un costrutto implicito pubblico senza argomenti e sì, finché non è definitivo, può essere sottoclassato.

Se la classe ha solo costruttori privati, quindi no, non può.

+0

La classe in questione ha solo costruttori privati, incluso quello senza argomenti, quindi suppongo di essere solo sfortunato. –

+0

Sembra che quella classe non sia molto amichevole in termini di test. Dovresti davvero usare le interfacce piuttosto che i tipi concerete ... –

+1

Quindi stai testando un singleton? Questo risulta sempre essere un dolore nel sedere. –

2

Se la classe java non ha costruttori definiti, non c'è alcun problema per voi. I problemi saranno se la classe avrà definito tutti i costruttori e tutti saranno invisibili per te (privato).

0

Se esistono solo costruttori privati, è comunque possibile utilizzare la riflessione per poterli accedere dall'esterno della classe.

+0

Ma questo non ti aiuterà a prolungare la lezione. Il compilatore non ti permetterà di estendere una classe con solo costruttori privati. – Eddie

3

La domanda è stata risposta, ma per aggiungere un commento. Questo è spesso un buon momento per proporre che il codice sia scritto per essere in qualche modo testabile.

Non fatevi male a questo proposito, ricercate quello che serve (probabilmente Dipendenza da Iniezione almeno), imparate a scrivere mock e proporre una serie ragionevole di linee guida che consentiranno alle classi di essere più utili.

Abbiamo dovuto solo riscrivere un gruppo di singleton per usare DI, invece, perché i singleton sono notoriamente difficili da deridere.

Questo potrebbe non andare oltre, ma un certo livello di codifica per testabilità è standard nella maggior parte dei negozi professionali.

+0

La classe che stavo cercando di prendere in giro era una classe Blackberry su cui non ho alcun controllo. –

+0

Hai fatto un buon punto (supponendo che uno stia prendendo in giro il codice che possono cambiare), ma probabilmente questo dovrebbe essere stato inserito come commento invece di una risposta. – hotshot309

+0

Sono d'accordo ma l'incapacità di separare il testo in paragrafi nei commenti mi lascia spesso frugato, ma in questi giorni (tre anni dopo) penso che l'avrei fatto in modo esatto: vivere e imparare. –

3

Sì, è possibile prendere in giro l'oggetto, anche se potrebbe non essere possibile suddividerlo in sottoclasse (certamente non senza diventare molto intimo con il caricatore di classe, comunque). Here è come lo si fa con JMock.

Il derisione in questo modo consente di mantenere il tipo, senza sottoclassi, anche se probabilmente sarà difficile non riuscire a individuare solo determinati comportamenti. Quindi questo metodo è appropriato per testare classi che usano questa classe, non per testare la classe stessa.

Se si ha effettivamente accesso al codice sorgente della classe, è possibile implementare una classe interna che consente di estenderla, sebbene se si potesse fare ciò, si può semplicemente rendere privato anche uno dei pacchetti dei costruttori.

Esistono anche linguaggi dinamici che consentono di eseguire la sottoclasse e implementare un'interfaccia Java con cui il codice Java può interagire, ma non conosco i dettagli.

1

È possibile prendere in giro la classe e alcuni o tutti i relativi costruttori utilizzando JMockit.

È un kit di strumenti di derisione per Java che consente di prendere in giro qualsiasi cosa. Anche se la classe è non pubblica e/o annidata, può ancora essere derisa. Esistono diversi meccanismi in JMockit che possono essere utilizzati per questo. La distribuzione del toolkit contiene anche molti test JUnit di esempio.

Se la classe implementa un'interfaccia o estende una classe astratta, è possibile indicare a JMockit di "acquisire" e simulare le implementazioni del tipo di base su richiesta, poiché vengono caricate dalla JVM e persino assegnare le istanze create a una campo nella classe di test.

Problemi correlati