gpt4 book ai didi

spring - 在 Spring Context 加载实际的 Spring Bean 之前是否模拟了模拟 bean (@MockBean)?

转载 作者:行者123 更新时间:2023-12-02 09:00:11 25 4
gpt4 key购买 nike

让我们使用以下示例。

@Autowired
@MockBean
private Foo foobar;

Spring Context 是否首先加载类 Foo,然后应用模拟?或者 @Mockbean 是否以某种方式被检测到,Spring 创建并应用模拟,而不是将类 Foo 加载到 Spring 上下文中。我怀疑是后者,但我想确认一下。

最佳答案

Spring 将抛出异常。

让我们定义 Foo 类。

@Component
public class Foo {
public Foo() {
System.out.println("I am not a mock");
}
}

每当使用@Autowired进行测试时,spring都会注入(inject)一个Foo的实例,并且构造函数将打印“I am not a mock”,如下面的代码所示。

@SpringBootTest(classes = Main.class)
@RunWith(SpringRunner.class)
public class FooTest {

@Autowired
Foo foo;

@Test
public void test() {
System.out.println(foo);
}
}

另一方面,使用@MockBean,spring不会创建真正的bean,并且构造函数中的消息也不会被打印。该场景由以下代码表示。

@SpringBootTest(classes = Main.class)
@RunWith(SpringRunner.class)
public class FooTest {

@MockBean
Foo foo;
@Test
public void test() {
System.out.println(foo);
}
}

但是,当您尝试同时使用这两个注释时,Spring 将抛出由 IllegalStateException 引起的 BeanCreationException。这意味着字段 foo 不能具有现有值。执行以下代码时会发生这种情况:

@SpringBootTest(classes = Main.class)
@RunWith(SpringRunner.class)
public class FooTest {
// this will not work
@Autowired
@MockBean
Foo foo;

@Test
public void test() {
System.out.println(foo);
}
}

堆栈跟踪将类似于:

org.springframework.beans.factory.BeanCreationException: Could not inject field: com.tbp.Foo com.FooTest.foo; nested exception is java.lang.IllegalStateException: The field com.tbp.Foo com.FooTest.foo cannot have an existing value
at org.springframework.boot.test.mock.mockito.MockitoPostProcessor.inject(MockitoPostProcessor.java:413) ~[spring-boot-test-1.5.2.RELEASE.jar:1.5.2.RELEASE]

关于spring - 在 Spring Context 加载实际的 Spring Bean 之前是否模拟了模拟 bean (@MockBean)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50571621/

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