2016-07-06 59 views
5

Come posso simulare un enum a scopo di test usando Mockito? Dato questo esempio per l'enumerazione:Mock un enum usando Mockito in Java

public enum TestEnum { 
YES, 
NO 
} 

e questo per il metodo con l'enum:

public static boolean WorkTheEnum(TestEnum theEnum) { 
switch (theEnum) { 
    case YES: 
    return true; 
    case NO: 
    return false; 
    default: 
    // throws an exception here 
} 
} 

come posso prendere in giro l'enum per raggiungere il ramo di default del ciclo switch? This answer dice che Mockito non può prendere in giro enum ma la risposta è stata fornita anche più di un anno fa. Nel frattempo posso prendere in giro un enum o devo lasciare che il ramo rimanga non testato? Non è possibile utilizzare altri framework Mocking.

+0

ci sono modi hacky per farlo: [dell'hacking enumerazioni e la modifica di "static final" Campi] (http://www.javaspecialists.eu/archive/Issue161.html) – Jesper

+3

Enum sono come classe statica, pertanto si puo' li moke con mokito. Nel tuo esempio, il valore predefinito non è raggiungibile, quindi non puoi testarlo. –

+0

Perché testare un percorso non raggiungibile? – Manu

risposta

5

Ci sono due risposte a questa:

a) si potrebbe trasformare in una certa quadro di scherno PowerMock-like. I miei due centesimi (entrate) lì: non farlo. PowerMock apre una porta sulla terra del dolore; che non vuoi inserire.

b) mettere le interfacce sulle enumerazioni

Scherzi a parte; Al giorno d'oggi penso che ci sia un solo caso di buon uso per le enumerazioni; e cioè usarli come singleton che forniscono un certo servizio. E poi, faccio questo:

public interface FooService { void foo(); } 
class FooServiceImpl implements FooService { @Override void foo() ... 
enum FooServiceProvider implements FooService { 
    INSTANCE; 
    private final FooService impl = new FooServiceImpl(); 
    @Override foo() { impl.foo() 

Ovviamente, questo non aiuta molto quando si usano le enumerazioni come si fa. Ma la cosa è: non dovresti comunque usare enumerazioni in questo modo. Poiché l'uso di enumerazioni in questo modo porta a un codice frantumato, ogni luogo che richiede una variabile enum necessita di tali istruzioni switch; con tutte le conseguenze negative quando aggiungi/rimuovi casi enum.

Quindi, nel tuo caso: considera di passare a progetti OO veri, in cui sono presenti classi di base astratte che definiscono i metodi; e poi usi le fabbriche per creare sottoclassi (probabilmente basate su switch enum) che ti danno oggetti che fanno semplicemente la cosa giusta.