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

标签 spring spring-boot spring-test

让我们使用以下示例。

@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/

相关文章:

amazon-web-services - 亚马逊SES异常: IAM User is not authorized to perform `ses:SendRawEmail' on resource

java - 如何将数据模型模拟注入(inject)到Spring Controller 中?

java - 在自定义 Spring 端点的单元测试期间,GET "Connection refused"上出现 I/O 错误,该端点命中 Spring Controller 中的默认 swagger 端点

java - 测试单元 Spring Boot : Unable to register mock bean

spring - 如何使用Spring ColumnMapRowMapper?

java - Spring MVC : detect if an exception has been thrown while loading the context

java - 使用 react 堆即发即忘

java - Spring Bean/存储库的 ID

java - 线程池任务执行器

spring - 记录 @Controller 请求 Spring Boot