如何在Spock测试中模拟环境变量为@Value注入的fileDirName赋值?
解决方案
以下是不同测试场景下的可用方案:
场景1:测试启动Spring上下文(使用@SpringBootTest/@ContextConfiguration)
直接在测试类上加@TestPropertySource注解,手动指定配置值即可完成注入:
@SpringBootTest @TestPropertySource(properties = ["file.dir.name=/tmp/test/files"]) class FileServiceTest extends Specification { @Autowired FileService service def 'test file'() { when: def result = service.getFiles() then: result.success == Boolean.TRUE } }
也可以直接把配置写在@SpringBootTest注解的properties属性中:
@SpringBootTest(properties = ["file.dir.name=/tmp/test/files"]) class FileServiceTest extends Specification { // 测试逻辑保持不变 }
场景2:纯单元测试,不启动Spring上下文
不需要启动Spring容器,直接用Spring提供的ReflectionTestUtils工具类给私有属性赋值,写在测试前置方法中即可:
class FileServiceTest extends Specification { FileService service = new FileService() def setup() { ReflectionTestUtils.setField(service, "fileDirName", "/tmp/test/files") } def 'test file'() { when: def result = service.getFiles() then: result.success == Boolean.TRUE } }
场景3:需要模拟系统环境变量生效
如果你的配置本身是从系统环境变量读取的,可以在测试前置设置系统属性,测试结束后清理避免影响其他用例:
class FileServiceTest extends Specification { def setup() { System.setProperty("file.dir.name", "/tmp/test/files") } def cleanup() { System.clearProperty("file.dir.name") } // 测试逻辑保持不变 }
内容的提问来源于stack exchange,提问作者raaeusagvc
相关产品推荐
相关产品推荐

