UserService.java
@Service
class UserService {
//target test method
public int getUser(){
DbUtil.getMapper(UserMapper.java);
}
}
字符串
DbUtil.java
class DbUtil {
static DbService dbService;
public static <T> T getMapper(Class<T> clazz){
if(dbService == null){
dbService = ((DbService)) ApplicationContextManager.getBean("dbService");
}
return dbService.getSqlSessionTemplate().getMapper(clazz);
}
}
型
DbService.java
@Autowired
private SomeConfiguration configuration;
@Autowired
private SecondConfiguration secondConfiguration;
public SqlSessionTemplate getSqlSessionTemplate(){
//complecated logic...
}
型
FakeDbService.java
@Service
class FakeDbService extends DbService {
public SqlSessionTemplate getSqlSessionTemplate(){
// simple logic ...
}
}
型
测试配置
@Configuration
@Import(FakeDbService.class)
class TestConfiguration {
}
型
Test.java
@ContextConfiguration(classes = TestConfiguration.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {
@Autowired
private UserService userService;
@Test
public void userServiceTest(){
userService.getUser();
}
}
型
我的目的是测试UserService
中的getUser
方法。DbUtil
类使用ApplicationContextManager.getBean("dbService")
导入DbService
bean。因为DbService
类有很多依赖项,需要额外的依赖项,我试图创建一个FakeDbService
,它只覆盖必要的方法并继承DbService
。但它不起作用。
在创建spring容器时,不仅注册了FakeDbService
bean,还注册了父类DbService
bean。由于spring容器在执行时没有添加对DbService
的依赖,因此出现了找不到bean的错误。我想在spring容器生成过程中防止生成父类DbService
。
难道不能这样测试吗?或者有其他方法可以在上面的结构中测试?(但是,我不能修改DbService
和DbUtil
的源代码)
感谢你的帮助.
1条答案
按热度按时间r8xiu3jd1#
创建一个Spring组件,将
DbUtil
转换为非静态组件:字符串
将其注入
UserService
:型
然后使用Mockito进行测试,甚至不要启动Spring上下文。
型