我想在子bean注册的时候阻止父bean的注册

问题描述 投票:0回答:1

用户服务.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
的来源)

谢谢您的帮助。

java spring javabeans
1个回答
0
投票

创建一个 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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.