用户服务.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 {
}
测试.java
@ContextConfiguration(classes = TestConfiguration.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {
@Autowired
private UserService userService;
@Test
public void userServiceTest(){
userService.getUser();
}
}
我的目的是在
getUser
中测试UserService
方法。
使用 DbUtil
DbService
类导入 ApplicationContextManager.getBean("dbService")
bean。
因为 DbService
类有很多依赖项并且需要额外的依赖项,所以我尝试创建一个 FakeDbService
只重写必要的方法并继承 DbService
。
但没有成功。
创建spring容器时,不仅注册了
FakeDbService
bean,还注册了父类DbService
bean。
出现找不到bean的错误,因为spring容器执行时没有添加对DbService
的依赖。
我想阻止在 Spring 容器生成期间生成 DbService
,它是父类。
这样测试不就可以了吗? 或者在上面的结构中还有其他的测试方法吗? (但是,我无法修改
DbService
和DbUtil
的来源)
谢谢您的帮助。
创建一个 Spring 组件,将
DbUtil
转换为非静态组件:
@Component
class DbUtilComponent {
public <T> T getMapper(Class<T> clazz) { return DbUtil.getMapper(clazz); }
...
}
将其注入
UserService
:
@Service
class UserService {
private final DbUtilComponent dbUtilComponent;
public UserService(DbUtilComponent dbUtilComponent) {
this.dbUtilComponent = dbUtilComponent;
}
//target test method
public int getUser(){
dbUtilComponent.getMapper(UserMapper.java);
}
}
然后只需使用 Mockito 进行测试,甚至不需要启动 Spring 上下文。
@ExtendWith(MockitoExtension.class)
public class Test {
@Mock
private DbUtilComponent dbUtilComponent;
@InjectMocks
private UserService userService;
@Test
public void userServiceTest(){
when(dbUtilComponent.getMapper(UserMapper.class)).thenReturn(...);
userService.getUser();
}
}