在应用程序启动之前配置@MockBean组件
2022-09-01 02:10:08
我有一个Spring Boot 1.4.2应用程序。启动期间使用的一些代码如下所示:
@Component
class SystemTypeDetector{
public enum SystemType{ TYPE_A, TYPE_B, TYPE_C }
public SystemType getSystemType(){ return ... }
}
@Component
public class SomeOtherComponent{
@Autowired
private SystemTypeDetector systemTypeDetector;
@PostConstruct
public void startup(){
switch(systemTypeDetector.getSystemType()){ // <-- NPE here in test
case TYPE_A: ...
case TYPE_B: ...
case TYPE_C: ...
}
}
}
有一个组件用于确定系统类型。此组件在从其他组件启动期间使用。在生产中,一切正常。
现在我想使用Spring 1.4添加一些集成测试。@MockBean
测试如下所示:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyWebApplication.class, webEnvironment = RANDOM_PORT)
public class IntegrationTestNrOne {
@MockBean
private SystemTypeDetector systemTypeDetectorMock;
@Before
public void initMock(){
Mockito.when(systemTypeDetectorMock.getSystemType()).thenReturn(TYPE_C);
}
@Test
public void testNrOne(){
// ...
}
}
基本上,嘲笑工作正常。我的 systemTypeDetectorMock 被使用,如果我调用 -> 返回。getSystemType
TYPE_C
问题是应用程序无法启动。目前弹簧工作顺序似乎是:
- 创建所有模拟(不带配置,所有方法都返回 null)
- 开始申请
- 调用@Before方法(将配置模拟的位置)
- 开始测试
我的问题是应用程序以未初始化的模拟开始。因此,对 的调用返回 null。getSystemType()
我的问题是:如何在应用程序启动之前配置模拟?
编辑:如果有人遇到同样的问题,一种解决方法是使用 。这调用了真正的组件,在我的情况下,系统启动。启动后,我可以更改模拟行为。@MockBean(answer = CALLS_REAL_METHODS)