在注入之前初始化 spring 引导模拟
Init spring boot mocks before they are injected
有没有办法在将模拟注入另一个组件之前初始化模拟?
举个例子,我有以下 类:
@Service
SomeService {
@Autowired
public SomeService(SomeConfig config)
}
@Configuration
@Getter
@Setter
public class SomeConfig {
private String someValue;
}
在我的测试中,我正在做以下事情:
@MockBean
SomeConfig someConfig;
@Autowired
SomeService someService;
问题是,SomeService
构造函数已经在访问 SomeConfig
成员,在我什至可以用 when(someConfig.getSomeValue()).thenReturn("something")
初始化它之前,导致 NullPtrException
。
在 SomeService
实例化之前是否有一个钩子被执行?
我假设 SomeService 看起来像:
@Service
SomeService {
private final SomeConfig config
@Autowired
public SomeService(SomeConfig config) {
this.someConfig = someConfig;
// some logic with config getters
}
}
你应该使用注解
@PostConsturct 在一个单独的方法中,并将配置 getter 的用法放在那里,如:
@PostConstruct
private void postConstruct() {
// some logic with config getters
}
您可以在设置方法中手动设置您的服务。
请确保在这些测试中将您的 SomeService 从类路径扫描中排除。
SomeServiceTest {
@MockBean
SomeConfig someConfig;
SomeService someService;
@BeforeEach
public void setup(){
// init mocks
// setup other stuff
someService = new SomeService(someConfig);
}
}
有没有办法在将模拟注入另一个组件之前初始化模拟?
举个例子,我有以下 类:
@Service
SomeService {
@Autowired
public SomeService(SomeConfig config)
}
@Configuration
@Getter
@Setter
public class SomeConfig {
private String someValue;
}
在我的测试中,我正在做以下事情:
@MockBean
SomeConfig someConfig;
@Autowired
SomeService someService;
问题是,SomeService
构造函数已经在访问 SomeConfig
成员,在我什至可以用 when(someConfig.getSomeValue()).thenReturn("something")
初始化它之前,导致 NullPtrException
。
在 SomeService
实例化之前是否有一个钩子被执行?
我假设 SomeService 看起来像:
@Service
SomeService {
private final SomeConfig config
@Autowired
public SomeService(SomeConfig config) {
this.someConfig = someConfig;
// some logic with config getters
}
}
你应该使用注解 @PostConsturct 在一个单独的方法中,并将配置 getter 的用法放在那里,如:
@PostConstruct
private void postConstruct() {
// some logic with config getters
}
您可以在设置方法中手动设置您的服务。
请确保在这些测试中将您的 SomeService 从类路径扫描中排除。
SomeServiceTest {
@MockBean
SomeConfig someConfig;
SomeService someService;
@BeforeEach
public void setup(){
// init mocks
// setup other stuff
someService = new SomeService(someConfig);
}
}