小编kom*_*omo的帖子

Spring - 在test中替换@Service bean

在我的春季启动应用程序中,我有一个服务bean(带有@Service注释),我想在特定的JUnit测试中模拟这个服务(不是在所有测试中).如何仅针对一个特定测试替换此服务bean?

服务声明为:

@Service
public class LocalizationServiceImpl implements LocalizationService {
   ...
}
Run Code Online (Sandbox Code Playgroud)

应用配置类:

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages="my.package")
@EntityScan

public class Application {
...
}
Run Code Online (Sandbox Code Playgroud)

测试类:

@Transactional
@SpringApplicationConfiguration(classes = LocalizationServiceTest.LocalizationServiceTestConfig.class)
public class LocalizationServiceTest extends ESContextTest {

    @Autowired
    private LocalizationService locService;

    @Configuration  
    public static class LocalizationServiceTestConfig {

        @Bean
        public LocalizationService localizationServiceImpl() {
            return mock(LocalizationService.class);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

和测试类父母:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public abstract class ESContextTest {
...
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.当我运行测试时,原始的LocalizationServiceImpl用于自动装配的locService属性.这出现在日志文件中:[BeanMethod:name = localizationService,declaringClass = ... LocalizationServiceTest $ LocalizationServiceTestConfig]的跳过bean定义:bean"localizationService"的定义已经存在.此顶级bean定义被视为覆盖.

当我在LocalizationServiceTestConfig中为@Bean方法使用不同的名称时,例如localizationServiceMock()(与原始实现类名不同)然后spring throws

'No qualifying bean of type …
Run Code Online (Sandbox Code Playgroud)

testing service configuration spring javabeans

6
推荐指数
1
解决办法
2019
查看次数

标签 统计

configuration ×1

javabeans ×1

service ×1

spring ×1

testing ×1