如何在测试期间禁用春季@PostConstruct

2022-09-04 20:56:10

在春季组件中,我有一个声明。类似于以下内容:@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 .....
}

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


答案 1

以下任一项:

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

答案 2

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


推荐