gpt4 book ai didi

java - 在应用程序启动之前配置@MockBean 组件

转载 作者:IT老高 更新时间:2023-10-28 13:55:39 25 4
gpt4 key购买 nike

我有一个 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 被返回。

问题是应用程序没有启动。目前 Spring 的工作顺序似乎是:

  1. 创建所有 Mocks(无需配置所有方法都返回 null)
  2. 开始申请
  3. 调用@Before-methods(将在其中配置模拟)
  4. 开始测试

我的问题是应用程序以未初始化的模拟开始。所以对 getSystemType() 的调用返回 null。

我的问题是:如何在应用程序启动之前配置模拟

编辑:如果有人遇到同样的问题,一个解决方法是使用@MockBean(answer = CALLS_REAL_METHODS)。这调用了真正的组件,在我的情况下,系统启动了。启动后,我可以更改模拟行为。

最佳答案

在这种情况下,您需要以我们在引入 @MockBean 之前使用的方式配置模拟 - 通过手动指定将替换的 @Primary bean上下文中的原始版本。

@SpringBootTest
class DemoApplicationTests {

@TestConfiguration
public static class TestConfig {

@Bean
@Primary
public SystemTypeDetector mockSystemTypeDetector() {
SystemTypeDetector std = mock(SystemTypeDetector.class);
when(std.getSystemType()).thenReturn(TYPE_C);
return std;
}

}

@Autowired
private SystemTypeDetector systemTypeDetector;

@Test
void contextLoads() {
assertThat(systemTypeDetector.getSystemType()).isEqualTo(TYPE_C);
}
}

由于 @TestConfiguration 类是一个静态内部类,它只会被这个测试自动选择。您将放入 @Before 的完整模拟行为必须移至初始化 bean 的方法。

关于java - 在应用程序启动之前配置@MockBean 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40563409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com