在注入之前初始化 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);
  }

}