2012-11-05 18 views
9

W komponencie Spring mam instrukcję @PostConstruct. Podobny do poniżej:Jak wyłączyć @PostConstruct na wiosnę podczas testu

@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 ..... 
} 

Podczas testów jednostkowych nie chciałby mieć funkcję @PostConstruct nazwie, czy istnieje sposób, aby opowiadać Wiosna nie wolno publikować przetwarzanie? A może jest lepsza adnotacja do wywoływania metody inicjacji w klasie, która nie jest testowana?

+0

Czy jest to FileListService, które chcesz przetestować lub inne klasy w zależności od tego? – mrembisz

+0

Usługa FileListService jest wymagana przez testowaną usługę sieci Web - publiczna klasa FileWSTest przedłuża program JerseyTest, który korzysta z kontenera WWW grizzly. – Ben

+3

Można go wyśmiać za pomocą podklasy lub zoptymalizować część inicjalizacyjną. Możesz umieszczać fałszywe próbki w paczce skanowanej tylko w celach testowych i oznaczać ją jako '@ Primary'. – mrembisz

Odpowiedz

4

Ponieważ nie testuje się FileListService, ale jest to klasa zależna, można z niej kpić do testów. Przygotuj wersję próbną w osobnym pakiecie testowym, który jest skanowany tylko w kontekście testowym. Oznacz go adnotacją @Primary, aby miała pierwszeństwo przed wersją produkcyjną.

4

Każdy z:

  1. Podklasa FileListService w teście i zastąpić metodę robić nic (jak mrembisz mówi, trzeba by umieścić podklasę w pakiecie zeskanowany tylko do testów i oznaczyć ją jako @Primary)
  2. Zmień FileListService więc lista plików jest wstrzykiwany przez sprężynę (to jest czystsze projekt tak), a w badaniach, wstrzyknąć pustą listę
  3. Wystarczy utworzyć go new FileListService() i wstrzyknąć współzależności siebie
  4. Uruchomienie wiosny przy użyciu innego pliku/klasy konfiguracji, bez korzystania z konfiguracji adnotacji.
+0

FileListService to @Component, który został znaleziony wiosną przy użyciu , więc przesłonięcie nie powstrzyma wiosną przed znalezieniem to. Również niektóre PostConstruct faktycznie robią inne rzeczy, więc musiałbym wstrzyknąć funkcję, a nie dane. Zgaduję, że potrzebowałbym sposobu wstrzyknięcia klasy Wyśmiewanej, która nadpisuje istniejący identyfikator fasoli – Ben

Powiązane problemy