Проверяется ли макет bean-компонента (@MockBean) перед загрузкой контекста Spring фактического Spring-контекста? - PullRequest
0 голосов
/ 28 мая 2018

Давайте в качестве примера рассмотрим следующее.

@Autowired
@MockBean
private Foo foobar;

Загружает ли Spring Context класс Foo, а затем применяет макет?Или @Mockbean обнаруживается как-то, и Spring создает и применяет макет вместо загрузки класса Foo в Spring Context.У меня есть подозрение, что это последнее, но я хотел бы получить подтверждение.

1 Ответ

0 голосов
/ 29 мая 2018

Spring выдаст исключение.

Давайте определим класс Foo.

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

При тестировании с использованием @Autowired пружина внедряет экземпляр 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 выдаст BeanCreationException, вызванное IllegalStateException.Это означает, что поле 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...