Впорскування Mockito знущається у весняний боб


284

Я хотів би ввести макетний об’єкт Mockito в боб Spring (3+) для цілей тестування блоку з JUnit. Наразі мої залежності від квасолі вводяться за допомогою @Autowiredанотації на поля приватних членів.

Я розглядав можливість використання, ReflectionTestUtils.setFieldале екземпляр bean, який я хочу ввести, є насправді проксі, і, отже, не оголошує поля приватних членів цільового класу. Я не хочу створювати загальнодоступний сетер для залежності, оскільки потім буду модифікувати свій інтерфейс виключно для цілей тестування.

Я дотримувався декількох порад, які дала громада Spring, але макет не створюється, і автоматичне підключення не вдається:

<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.package.Dao" />
</bean>

Помилка, з якою я зараз стикаюся, полягає в наступному:

...
Caused by: org...NoSuchBeanDefinitionException:
    No matching bean of type [com.package.Dao] found for dependency:
    expected at least 1 bean which qualifies as autowire candidate for this dependency.
    Dependency annotations: {
        @org...Autowired(required=true),
        @org...Qualifier(value=dao)
    }
at org...DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(D...y.java:901)
at org...DefaultListableBeanFactory.doResolveDependency(D...y.java:770)

Якщо я встановив constructor-argзначення на щось недійсне, при запуску контексту програми не виникає помилок.


4
Погляньте на цю крихітну істоту: bitbucket.org/kubek2k/springockito/wiki/Home
kubek2k

Це дуже чистий підхід - мені це подобається!
чайник

2
Ви мали мене на Springockito-анотаціях.
yihtserns


2
Для тих, хто використовує весну 4. *, станом на січень 2015 року, здається, це не працює з останньою версією весняного макето, і проект видається неактивним.
Муралі

Відповіді:


130

Найкращий спосіб:

<bean id="dao" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.package.Dao" /> 
</bean> 

Оновлення
У контекстному файлі цей макет повинен бути вказаний перед будь-яким полем з автоматичним проводом залежно від його оголошення.


Я отримую помилку: "Помилка створення bean з назвою" mockito ": визначення bean є абстрактним"
tttppp

4
@amra: весна dosn't визначити тип об'єкта , повернутого в цьому випадку ... stackoverflow.com/q/6976421/306488
Лисак

7
Не знаю, чому ця відповідь настільки обґрунтована, що отриманий боб не може бути автоматичним, тому що він має неправильний тип.
азерол

4
Її можна встановити автоматично, якщо вона спочатку вказана у файлі контексту (до того, як будуть оголошені будь-які автоматичні провідні поля, які залежать від неї)
Ryan Walls

3
Станом на весну 3.2, порядок бобів вже не має значення. Дивіться розділ «Загальні фабричні методи» у цьому дописі у блозі: spring.io/blog/2012/11/07/…
Ryan Walls

110
@InjectMocks
private MyTestObject testObject;

@Mock
private MyDependentObject mockedObject;

@Before
public void setup() {
        MockitoAnnotations.initMocks(this);
}

Це додасть до тестового класу будь-які глузуючі об'єкти. У цьому випадку він буде вводити mockedObject у testObject. Про це було сказано вище, але ось код.


1
Як заглушити конкретний метод mockedObject?
Джим Холден

@Teinacher when (mockedObject.execute) .thenReturn (objToReturn); Ви можете помістити це або в метод раніше, або всередині вашого методу тестування.
хаостерія

40
FYI: Цей підхід не буде працювати, якщо я хочу часткове автоматичне підключення та часткове глузування в MyTestObject.
raksja

9
Я не знаю, чому це не проголосували вище. Якщо я побачу більше відповідей, що містять XML, я піду.
MarkOfHall

3
Чому ви не скористаєтесь Mockito.spy(...)цим mockedObjectзамість цього? А потім використовувати when(mockedObject.execute).thenReturn(objToReturn)або doReturn(objToReturn).when(mockedObject).execute(). Другий не посилається на реальний метод. Ви також можете перевірити Mockito.doCallRealMethod()документацію
Томаш Прижильський

63

У мене дуже просте рішення за допомогою Spring Java Config та Mockito:

@Configuration
public class TestConfig {

    @Mock BeanA beanA;
    @Mock BeanB beanB;

    public TestConfig() {
        MockitoAnnotations.initMocks(this); //This is a key
    }

    //You basically generate getters and add @Bean annotation everywhere
    @Bean
    public BeanA getBeanA() {
        return beanA;
    }

    @Bean
    public BeanB getBeanB() {
        return beanB;
    }
}

4
Чомусь при такому підході весна намагається все-таки створити фактичну квасолю (замість насмішки) і задушиться ... Що я роблю неправильно?
Даніель Грущик

1
У мене те саме питання
Коробко Олексій

3
Не весна, а навпаки, мокіто намагається створити фактичну фасолю, якщо ви знущаєтесь з класу. Якщо у вас є якісь квасолі, з якими потрібно знущатися в тестах, вони повинні бути реалізаціями інтерфейсу та введені через цей інтерфейс. Якщо ви знущаєтесь над інтерфейсом (а не класом), mockito не намагатиметься інстанціювати цей клас.
Даніель Грущик

7
У чому сенс? Навіщо додавати анотовані поля та конструктор initMocks? Чому не просто return Mockito.mock(BeanA.class)в getBeanA? Таким чином, це простіше і менше коду. Що я пропускаю?
Олег

1
@Oleg це здається, що у вас є власне рішення, яке, ймовірно, слід опублікувати як відповідь, щоб громада могла проголосувати за нього.
Dawood ibn Kareem

48

Подано:

@Service
public class MyService {
    @Autowired
    private MyDAO myDAO;

    // etc
}

Ви можете мати клас, який тестується, завантажений за допомогою автоматичного підключення, знущатися над залежністю з Mockito, а потім використовувати Spring's ReflectionTestUtils, щоб ввести макет у тестований клас.

@ContextConfiguration(classes = { MvcConfiguration.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class MyServiceTest {
    @Autowired
    private MyService myService;

    private MyDAO myDAOMock;

    @Before
    public void before() {
        myDAOMock = Mockito.mock(MyDAO.class);
        ReflectionTestUtils.setField(myService, "myDAO", myDAOMock);
    }

    // etc
}

Будь ласка , зверніть увагу , що до весни 4.3.1, цей метод не буде працювати з сервісами за проксі (анотацію @Transactional, або Cacheable, наприклад). Це було зафіксовано SPR-14050 .

Для попередніх версій рішенням є розкручування проксі-сервера, як описано там: Анотація щодо транзакцій дозволяє уникнути знущань із служб (що зараз ReflectionTestUtils.setFieldробиться за замовчуванням)


Подвійний @RunWith (SpringJUnit4ClassRunner.class), і я використовую різні анотації для тестового класу (той самий бігун), але такий підхід працює для мене, дякую.
користувач1317422

1
Мене дуже надихнуло "Зверніть увагу, що до весни 4.3.1 цей метод не працюватиме із службами, що стоять за проксі-сервером (примітка, наприклад, з @Transactional або Cacheable. Це було виправлено SPR-14050"). Я щойно вирішив вирішити цю проблему і не знайшов жодної підказки, поки не помітив цього слова. ДУЖЕ ДЯКУЮ!
сніжинка

1
Це рішення обробляється, коли ви з’єднали весь контекст програми та з метою тестування бажаєте ввести макет у випадковий боб у вашому контексті. Я використовував цю відповідь, щоб знущатися над бойовим клієнтом, щоб уникнути викликів REST до інших модулів у тесті модуля. Я отримав анотацію InjectMock для роботи лише тоді, коли ви вводите макети в квасоля, яку ви збираєтеся перевірити, а не в квасолі, створеній Spring Configuration Configuration.
Андреас Лундгрен

1
Майже цілий день розмахуючи, намагаючись змусити @MockBean працювати без скидання контексту, і тоді я натрапив на цей дорогоцінний камінь. Саме те, що мені було потрібно, привіт.
Метт Р

Працює, хоча будьте обережні, що замінене поле може не скинутись через кешування, і деякі непов'язані тести можуть зламатися. Наприклад, у своєму тесті я замінив кодер пароля макетом, а кілька інших тестів зламано через помилки авторизації.
alextsil

36

Якщо ви використовуєте Spring Boot 1.4, це має приголомшливий спосіб зробити це. Просто використовуйте новий бренд @SpringBootTestу своєму класі та @MockBeanна полі, і Spring Boot створить макет такого типу, і він введе його в контекст (замість того, щоб вводити оригінальний):

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

    @MockBean
    private RemoteService remoteService;

    @Autowired
    private Reverser reverser;

    @Test
    public void exampleTest() {
        // RemoteService has been injected into the reverser bean
        given(this.remoteService.someCall()).willReturn("mock");
        String reverse = reverser.reverseSomeCall();
        assertThat(reverse).isEqualTo("kcom");
    }

}

З іншого боку, якщо ви не використовуєте Spring Boot або використовуєте попередню версію, вам доведеться зробити трохи більше роботи:

Створити @Configuration боб, який вводить ваші макети в контекст весни:

@Configuration
@Profile("useMocks")
public class MockConfigurer {

    @Bean
    @Primary
    public MyBean myBeanSpy() {
        return mock(MyBean.class);
    }
}

Використання @Primary анотацію, ви говорите весною, що цей боб має пріоритет, якщо не вказано жодного класифікатора.

Переконайтеся, що ви коментуєте клас @Profile("useMocks") , щоб контролювати, які класи використовуватимуть макет, а які - використовувати справжній.

Нарешті, у своєму тесті активуйте userMocksпрофіль:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Application.class})
@WebIntegrationTest
@ActiveProfiles(profiles={"useMocks"})
public class YourIntegrationTestIT {

    @Inject
    private MyBean myBean; //It will be the mock!


    @Test
    public void test() {
        ....
    }
}

Якщо ви не хочете використовувати макет, а справжній боб, просто не активуйте useMocksпрофіль:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Application.class})
@WebIntegrationTest
public class AnotherIntegrationTestIT {

    @Inject
    private MyBean myBean; //It will be the real implementation!


    @Test
    public void test() {
        ....
    }
}

5
Ця відповідь повинна перейти до вершини - підтримка @MockBean у весняному завантаженні також може використовуватися без весняного завантаження. Ви можете використовувати його тільки в одиничних тестах, щоб він працював для всіх весняних застосувань!
бедрин

2
@Profile анотацію ви можете встановити також методом визначення bean, щоб уникнути створення окремого класу конфігурації
marcin

Чудова відповідь! Я вніс кілька змін, щоб він працював зі старою школою web.xmlта налаштуванням AnnotationConfigWebApplicationContext. Довелося використовувати @WebAppConfigurationзамість @WebIntegrationTestі @ContextHierarchyз @ContextConfigurationзамість @SpringApplicationConfiguration.
UTF_or_Death

Мені довелося додати @Primaryанотацію до моєї справи, оскільки все-таки був невдалий дзвінок усередині a, @PostConstructякий я хотів знущатися, але @PostConstructбоб був створений перед моїм макетом, щоб він не використовував макет (доки я не додав @Primary).
helleye

19

Оскільки 1.8.3 має Mockito @InjectMocks- це неймовірно корисно. Мої тести JUnit - @RunWithце MockitoJUnitRunnerі я будую @Mockоб'єкти, які задовольняють всі залежності для тестуваного класу, які всі вводяться, коли приватний член анотується@InjectMocks .

Я @RunWithтойSpringJUnit4Runner для інтеграції тестів тільки зараз.

Зауважу, що, здається, він не може зробити ін'єкцію List<T>так само, як Весна. Він шукає лише об'єкт Mock, який задовольняє Listта не вводить список об'єктів Mock. Для мене вирішенням було використання @Spyпроти списку, створеного вручну, вручну. Можливо, це було навмисно, бо це, безумовно, змусило мене приділити пильну увагу тому, що знущаються разом.


Так, це найкращий спосіб. Спрингтокіто насправді не вводить знущання з будь-якої причини в моєму випадку.
хаостерія

13

Оновлення: Зараз є кращі, більш чіткі рішення цієї проблеми. Спочатку розгляньте інші відповіді.

Зрештою, я знайшов відповідь на це Ронен у своєму блозі. Проблема, яка була у мене, пов'язана з методом, що Mockito.mock(Class c)оголошує тип поверненняObject . Отже, Spring не в змозі вивести тип бобів із заводського методу повернення типу.

Рішення Ronen полягає у створенні FactoryBeanреалізації, яка повертає макети. TheFactoryBeanІнтерфейс дозволяє Spring запитувати тип об'єктів , створених на заводі бобу.

Моє глузливе визначення квасолі зараз виглядає так:

<bean id="mockDaoFactory" name="dao" class="com.package.test.MocksFactory">
    <property name="type" value="com.package.Dao" />
</bean>

1
Оновлене посилання на рішення Ronen: narkisr.com/blog/2008/2647754885089732945
Джефф Мартін

Я цього не розумію, заводський метод має тип повернення Object ... Але рішення amra має загальний тип повернення, щоб Spring міг його розпізнати ... Але рішення амри для мене не працює
lisak

Ні це рішення, весна не визначає тип бобу, який повертається з фабрики. Звідси немає відповідних бобів типу [com.package.Dao] ...
листопад


Це посилання насправді все ще працює: javadevelopmentforthemasses.blogspot.com/2008/07/… Просто вимкніть перенаправлення посилань у вашому браузері, і ви побачите його, замість того, щоб змусити переглянути 404 у своєму новому блозі.
приблизно

12

Станом на весну 3.2, це вже не проблема. Зараз Spring підтримує автоматичне підключення результатів загальних заводських методів. Дивіться розділ "Загальні заводські методи" в цьому дописі в блозі: http://spring.io/blog/2012/11/07/spring-framework-3-2-rc1-new-testing-features/ .

Ключовий момент:

Навесні 3.2, загальні типи повернення для заводських методів тепер належним чином виведені, і автоматичне з'єднання за типом для макетів має працювати як слід. Як результат, користувацькі робочі кола, такі як MockitoFactoryBean, EasyMockFactoryBean або Springockito, ймовірно, більше не потрібні.

Що означає, що це повинно працювати з коробки:

<bean id="dao" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.package.Dao" />
</bean>

9

Нижче код працює з автоматичним підключенням - це не найкоротша версія, але корисна, коли вона повинна працювати тільки зі стандартними баночками весна / мокіто.

<bean id="dao" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="target"> <bean class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.package.Dao" /> </bean> </property>
   <property name="proxyInterfaces"> <value>com.package.Dao</value> </property>
</bean> 

Працювали для мене. Мені довелося розгортати проксі в моєму тесті, щоб перевірити його, як описано тут: forum.spring.io/forum/spring-projects/aop/…
Holgzn

9

Якщо ви використовуєте spring> = 3.0 , спробуйте використовувати @Configurationанотацію Springs, щоб визначити частину контексту програми

@Configuration
@ImportResource("com/blah/blurk/rest-of-config.xml")
public class DaoTestConfiguration {

    @Bean
    public ApplicationService applicationService() {
        return mock(ApplicationService.class);
    }

}

Якщо ви не хочете використовувати @ImportResource, це можна зробити і навпаки:

<beans>
    <!-- rest of your config -->

    <!-- the container recognize this as a Configuration and adds it's beans 
         to the container -->
    <bean class="com.package.DaoTestConfiguration"/>
</beans>

Для отримання додаткової інформації ознайомтеся з Spring-frame-reference: Конфігурація контейнерів на основі Java


Хороший. Я використовував це, коли тест, який я тестую, є @Autowired у фактичному тестовому випадку.
enkor

8

Можливо, це не ідеальне рішення, але я, як правило, не використовую весну, щоб робити DI для одиничних тестів. Залежності для однієї квасолі (тестуваного класу) зазвичай не надто складні, тому я просто роблю ін'єкцію безпосередньо в тестовому коді.


3
Я розумію ваш підхід. Однак я опиняюсь у цій ситуації на великій базі спадкових кодів, яка не дозволяє цього легко зробити - поки що.
чайник

1
Я вважав комбо Mockito / Spring дуже корисним, коли мені потрібно перевірити код, який сильно залежить від аспектів Spring / AOP (наприклад, при тестуванні правил безпеки весни). Хоча можна сказати, що такі тести мають бути інтеграційним тестом, цілком виправданим.
Ларс Такманн

@ Lars - погодився - те саме можна сказати і про тести, з якими я маю справу.
чайник

7

Я можу зробити наступне за допомогою Mockito:

<bean id="stateMachine" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.abcd.StateMachine"/>
</bean>

1
Дякуємо за відповідь @Alexander. Чи можу я запитати: чи правильно це підключено? Якщо так, то які версії Spring / Mockito ви використовуєте?
чайник

6

Розміщення декількох прикладів на основі вищезазначених підходів

З весною:

@ContextConfiguration(locations = { "classpath:context.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class TestServiceTest {
    @InjectMocks
    private TestService testService;
    @Mock
    private TestService2 testService2;
}

Без весни:

@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest {
    @InjectMocks
    private TestService testService = new TestServiceImpl();
    @Mock
    private TestService2 testService2;
}

2

Оновлення - нова відповідь тут: https://stackoverflow.com/a/19454282/411229 . Ця відповідь стосується лише тих, які мають версії Spring до 3.2.

Я деякий час шукав більш чіткого рішення цього питання. Здається, ця публікація в блозі задовольняє всі мої потреби та не покладається на замовлення декларацій з квасолі. Вся заслуга Маттіаса Сіверсона. http://www.jayway.com/2011/11/30/spring-integration-tests-part-i-creating-mock-objects/

В основному, реалізуйте FactoryBean

package com.jayway.springmock;

import org.mockito.Mockito;
import org.springframework.beans.factory.FactoryBean;

/**
 * A {@link FactoryBean} for creating mocked beans based on Mockito so that they 
 * can be {@link @Autowired} into Spring test configurations.
 *
 * @author Mattias Severson, Jayway
 *
 * @see FactoryBean
 * @see org.mockito.Mockito
 */
public class MockitoFactoryBean<T> implements FactoryBean<T> {

    private Class<T> classToBeMocked;

    /**
     * Creates a Mockito mock instance of the provided class.
     * @param classToBeMocked The class to be mocked.
     */
    public MockitoFactoryBean(Class<T> classToBeMocked) {
        this.classToBeMocked = classToBeMocked;
    }

    @Override
    public T getObject() throws Exception {
        return Mockito.mock(classToBeMocked);
    }

    @Override
    public Class<?> getObjectType() {
        return classToBeMocked;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

Далі оновіть свою конфігурацію весни таким чином:

<beans...>
    <context:component-scan base-package="com.jayway.example"/>

    <bean id="someDependencyMock" class="com.jayway.springmock.MockitoFactoryBean">
        <constructor-arg name="classToBeMocked" value="com.jayway.example.SomeDependency" />
    </bean>
</beans>

2

Дивлячись на темпи розвитку Springockito та кількість відкритих питань , я би трохи потурбувався, щоб впровадити це у свій стек тестових наборів. Факт, що останній реліз був зроблений до випуску Spring 4, викликає питання типу "Чи можна легко інтегрувати його з Spring 4?". Я не знаю, бо не пробував. Я віддаю перевагу чистому весняному підходу, якщо мені потрібно знущатися з бобів весни в інтеграційному тесті.

Існує можливість підробити весняний боб з просто звичайними функціями Spring. Вам потрібно використовувати @Primary, @Profileі @ActiveProfilesанотацію до нього. Я написав допис у блозі на цю тему.


1

Я знайшов аналогічну відповідь, як і чайник, щоб створити MockFactory, який надає макети. Я використовував наступний приклад для створення фабрики макетів (оскільки посилання на narkisr мертве): http://hg.randompage.org/java/src/407e78aa08a0/projects/bookmarking/backend/spring/src/test/java/ org / randompage / bookmarking / backkend / testUtils / MocksFactory.java

<bean id="someFacade" class="nl.package.test.MockFactory">
    <property name="type" value="nl.package.someFacade"/>
</bean>

Це також допомагає запобігти тому, що Весна хоче розв’язати ін’єкції з здерев’янілих бобів.


1
<bean id="mockDaoFactory" name="dao" class="com.package.test.MocksFactory">
    <property name="type" value="com.package.Dao" />
</bean>

це ^ працює чудово, якщо оголошено перший / на початку файлу XML. Mockito 1.9.0 / Spring 3.0.5


1

Я використовую комбінацію підходу, використаного у відповіді Маркуса Т, і просту допоміжну реалізацію, ImportBeanDefinitionRegistrarяка шукає спеціальну анотацію (@MockedBeans ), в якій можна вказати, з яких класів слід знущатися. Я вважаю, що такий підхід призводить до стислого випробування блоку, з якого було знято частину кодового коду, пов’язаного з глузуванням.

Ось як виглядає вибірковий тест з таким підходом:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
public class ExampleServiceIntegrationTest {

    //our service under test, with mocked dependencies injected
    @Autowired
    ExampleService exampleService;

    //we can autowire mocked beans if we need to used them in tests
    @Autowired
    DependencyBeanA dependencyBeanA;

    @Test
    public void testSomeMethod() {
        ...
        exampleService.someMethod();
        ...
        verify(dependencyBeanA, times(1)).someDependencyMethod();
    }

    /**
     * Inner class configuration object for this test. Spring will read it thanks to
     * @ContextConfiguration(loader=AnnotationConfigContextLoader.class) annotation on the test class.
     */
    @Configuration
    @Import(TestAppConfig.class) //TestAppConfig may contain some common integration testing configuration
    @MockedBeans({DependencyBeanA.class, DependencyBeanB.class, AnotherDependency.class}) //Beans to be mocked
    static class ContextConfiguration {

        @Bean
        public ExampleService exampleService() {
            return new ExampleService(); //our service under test
        }
    }
}

Для цього потрібно визначити два простих допоміжні класи - користувацьку анотацію ( @MockedBeans) та користувацьку ImportBeanDefinitionRegistrarреалізацію. @MockedBeansВизначення анотацій потрібно позначати за допомогою @Import(CustomImportBeanDefinitionRegistrar.class)та ImportBeanDefinitionRgistrarдодавати до конфігурації в його registerBeanDefinitionsметоді дефініції заданих бобів .

Якщо вам подобається підхід, ви можете знайти зразки реалізації на моєму пості .


1

Я розробив рішення за пропозицією Кресімира Несека. Я додав нову анотацію @EnableMockedBean , щоб зробити код трохи більш чистим та модульним.

@EnableMockedBean
@SpringBootApplication
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=MockedBeanTest.class)
public class MockedBeanTest {

    @MockedBean
    private HelloWorldService helloWorldService;

    @Autowired
    private MiddleComponent middleComponent;

    @Test
    public void helloWorldIsCalledOnlyOnce() {

        middleComponent.getHelloMessage();

        // THEN HelloWorldService is called only once
        verify(helloWorldService, times(1)).getHelloMessage();
    }

}

Я написав пост , де це пояснюється.


1

Я б запропонував перенести ваш проект на Spring Boot 1.4. Після цього ви можете використовувати нову анотацію, @MockBeanщоб підробити своюcom.package.Dao


0

Сьогодні я з'ясував, що весняний контекст, де я оголосив перед бобами Mockito, не вдалося завантажити. Після переміщення ПІСЛЯ макетів контекст програми успішно завантажено. Піклуватися :)


1
Щось бракує. 8-) Ви переїхали, що після знущань?
Ганс-Пітер Штерр

0

Для запису всі мої тести правильно працюють, просто зробивши кріплення ліниво ініціалізованим, наприклад:

<bean id="fixture"
      class="it.tidalwave.northernwind.rca.embeddedserver.impl.DefaultEmbeddedServer"
      lazy-init="true" /> <!-- To solve Mockito + Spring problems -->

<bean class="it.tidalwave.messagebus.aspect.spring.MessageBusAdapterFactory" />

<bean id="applicationMessageBus"
      class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="it.tidalwave.messagebus.MessageBus" />
</bean>

<bean class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="javax.servlet.ServletContext" />
</bean>

Я припускаю, що обґрунтування - це той, який Маттіас пояснює тут (внизу посади), що спосіб вирішення змінює порядок декларування бобів - лінива ініціалізація є "свого роду", коли кріплення оголошено в кінці.


-1

Якщо ви використовуєте ін'єкцію контролера, переконайтесь, що ваші локальні змінні НЕ є "остаточними"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.