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]