如何在Spock测试中替换发起REST请求的Bean并注入自定义列表
问题解答
你的测试配置类无法直接实现Bean替换,原因是@SpringBean是Spock测试类专属注解,不能放在@Configuration类中使用。以下是几种可行的解决方案:
方案1:在Spock测试类中直接使用@SpringBean替换Bean
在你的Spock测试类中直接定义@SpringBean方法,Spring容器会优先使用这个Bean替代原有的同名Bean:
class YourTestSpec extends Specification { // 替换原有的getInvalidProduct Bean @SpringBean List<String> getInvalidProduct() { return Arrays.asList("AAA", "BBB", "CCC") } // 测试用例 def "test something"() { // ... 测试逻辑 } }
方案2:使用@Primary注解的测试配置类
修改你的测试配置类,用@Bean + @Primary标记,让测试环境优先加载这个Bean:
@Configuration public class TestConfiguration { @Bean @Primary // 标记为优先加载的Bean List<String> getInvalidProduct() { List<String> invalids = new ArrayList<>(); invalids.add("AAA"); invalids.add("BBB"); invalids.add("CCC"); return invalids; } }
然后在Spock测试类中导入该配置:
@SpringBootTest(classes = [YourApplication.class, TestConfiguration.class]) class YourTestSpec extends Specification { // 测试用例 }
方案3:重构原配置类,解耦初始化逻辑
将原配置类中的REST请求逻辑抽离成独立方法,方便测试时mock或重写:
@Configuration public class RequestService { @Autowired RestTemplate restTemplate; @Autowired JwtService jwtService; @Bean List<String> invalidProducts() { return fetchInvalidProducts(); } // 抽离成protected方法,方便测试重写 protected List<String> fetchInvalidProducts() { String jwt_access_token = this.jwtService.requestToken(); URI uri = new URI("https://localhost:8080"); ResponseEntity<?> response = this.restTemplate.exchange(uri, HttpMethod.GET, this.jwtService.helper(jwt_access_token), Product[].class); return response.getBody(); } }
测试时可以通过继承RequestService并重写fetchInvalidProducts方法,或者用@MockBean模拟JwtService和RestTemplate来避免真实请求。
另外注意:原配置类中的@Configuratin是拼写错误,正确应为@Configuration,虽然功能正常但建议修正。
内容的提问来源于stack exchange,提问作者Rue Honda
相关产品推荐
相关产品推荐

