How to disable @PostConstruct in Spring during Test

Ben picture Ben · Nov 5, 2012 · Viewed 9.9k times · Source

Within a Spring Component I have a @PostConstruct statement. Similar to below:

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

During Unit tests I would not like to have the @PostConstruct function called, is there a way to telling Spring not to do post processing? Or is there a better Annotation for calling a initiation method on a class durning non-testing ?

Answer

artbristol picture artbristol · Nov 5, 2012

Any of:

  1. Subclass FileListService in your test and override the method to do nothing (as mrembisz says, you would need to place the subclass in package scanned only for tests and mark it as @Primary)
  2. Change FileListService so the list of files is injected by Spring (this is a cleaner design anyway), and in your tests, inject an empty list
  3. Just create it with new FileListService() and inject the dependencies yourself
  4. Boot up Spring using a different configuration file/class, without using annotation configuration.