如何在测试期间在Spring中禁用@PostConstruct

时间:2012-11-05 11:34:48

标签: java spring annotations postconstruct

在Spring组件中,我有一个@PostConstruct语句。与下面类似:

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

在单元测试期间,我不希望调用@PostConstruct函数,有没有办法告诉Spring不要进行后期处理?或者是否有更好的注释用于在非测试期间调用类的启动方法?

3 个答案:

答案 0 :(得分:5)

任何一个:

  1. 您的测试中的子类FileListService并覆盖该方法不执行任何操作(正如mrembisz所说,您需要将子类放在扫描包中仅用于测试并将其标记为@Primary
  2. 更改FileListService以便Spring注入文件列表(无论如何这是一个更干净的设计),并在测试中注入一个空列表
  3. 只需使用new FileListService()创建并自行注入依赖项
  4. 使用不同的配置文件/类启动Spring,而不使用注释配置。

答案 1 :(得分:5)

由于您不是测试FileListService而是依赖类,您可以模拟测试。在单独的测试包中创建模拟版本,该测试包仅由测试上下文扫描。使用@Primary注释标记它,因此它优先于生产版本。

答案 2 :(得分:0)

声明一个bean来覆盖现有的类并将其设置为Primary。

@Bean
@Primary
public FileListService fileListService() {
 return mock(FileListService.class);
}