kom*_*omo 6 testing service configuration spring javabeans
在我的春季启动应用程序中,我有一个服务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 is defined: expected single matching bean but found 2: localizationServiceImpl,localizationServiceMock'
Run Code Online (Sandbox Code Playgroud)
所以我认为使用相同的名称是正确的.
唯一可行的解决方案是从LocalizationServiceImpl类中删除@Service注释,并为正常(非测试)app运行创建配置
@Configuration
public class BeansConfig {
@Bean
public LocalizationService localizationServiceImpl() {
return new LocalizationServiceImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在测试运行中,自动装配正确的模拟实现.
但是应该可以通过@Service注释做同样的事情,不应该吗?
谢谢你的建议.
发现由我自己的解决方案:重命名localizationServiceImpl()
例如以localizationServiceMock()
在类LocalizationServiceTestConfig
和注释与方法@Primary
.
但是为什么简单地用相同的'id'重新定义bean并不像通过xml-config那样工作?
归档时间: |
|
查看次数: |
2019 次 |
最近记录: |