12

在 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 不要进行后期处理?或者在非测试期间调用类的启动方法是否有更好的注释?

4

4 回答 4

7

任何:

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

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

于 2012-11-05T13:07:21.937 回答
1

声明一个 bean 以覆盖现有类并使其成为 Primary。

@Bean
@Primary
public FileListService fileListService() {
 return mock(FileListService.class);
}
于 2018-09-21T01:33:46.277 回答
0

检查配置文件是这样的:

  @PostConstruct
    public void populate () {
       if (!Arrays.asList(this.environment.getActiveProfiles()).contains("test")) {    
         for (File f : FileUtils.listFiles(new File(SystemUtils.JAVA_IO_TMPDIR), new 
              String[]{"txt"},true)){
            listOfFiles.add(f.getName());
          } 

        }           
    }
于 2022-01-25T10:35:16.000 回答