2012-11-05 9 views
9

All'interno di un componente Spring ho una dichiarazione @PostConstruct. Simile al di sotto:Come disabilitare @PostConstruct in primavera durante il test

@Singleton 
@Component("filelist") 
public class FileListService extends BaseService { 

    private List listOfFiles = new Arrays.list(); 

    //some other functions 


    @PostConstruct 
    public void populate() { 

     for (File f : FileUtils.listFiles(new File(SystemUtils.JAVA_IO_TMPDIR), new String[]{"txt"},true)){ 
      listOfFiles.add(f.getName()); 
     } 
    } 

    @Override 
    public long count() throws DataSourceException { 
     return listOfFiles.size(); 
    } 

    // more methods ..... 
} 

Durante i test di unità che non vorrebbe avere la funzione @PostConstruct chiamata, c'è un modo per raccontare primavera di non fare l'elaborazione post? O c'è una migliore annotazione per chiamare un metodo di inizializzazione su una classe che non sta testando?

+0

È FileListService che si desidera testare o altre classi a seconda di esso? – mrembisz

+0

Il servizio FileList è richiesto da un servizio Web che è in fase di test - FileWSTest di classe pubblica estende JerseyTest, che utilizza il contenitore web grizzly – Ben

+3

È possibile prenderlo in giro usando una sottoclasse o troncare la parte di inizializzazione. È possibile inserire il mock nel pacchetto scansionato solo per i test e contrassegnarlo come '@ Primario'. – mrembisz

risposta

4

Poiché non si sta testando FileListService ma una classe dipendente, è possibile prendere in giro per i test. Crea una versione fittizia in un pacchetto di test separato che viene scansionato solo dal contesto di test. Contrassegnalo con l'annotazione @Primary in modo che abbia la precedenza sulla versione di produzione.

4

Qualsiasi di:

  1. sottoclasse FileListService nel test e l'override del metodo di non fare nulla (come mrembisz dice, si avrebbe bisogno di collocare la sottoclasse in package a scansione solo per le prove e segnare come @Primary)
  2. Modifica FileListService così l'elenco dei file viene iniettato entro la primavera (questo è un disegno più pulito in ogni caso), e nei test, iniettare una lista vuota
  3. basta creare con new FileListService() e iniettare le dipendenze da soli
  4. Avviare Spring utilizzando un file/classe di configurazione diverso, senza utilizzare la configurazione dell'annotazione.
+0

Il FileListService è un @Component che viene trovato da Spring usando , quindi l'override non impedirà alla primavera di trovare esso. Anche alcuni PostConstruct faranno effettivamente altre cose, quindi avrei bisogno di iniettare una funzione e non i dati. Immagino che mi servirebbe un modo per iniettare una classe Mocked che sovrascriva l'ex bean-id – Ben

Problemi correlati