Инъекционный макет @Service для модульных тестов Spring - PullRequest
18 голосов
/ 07 января 2011

Я тестирую класс, который использует @Autowired для внедрения службы:

public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {

    @Autowired
    private RuleStore ruleStore;

    // Some other methods
}

Но как я могу смоделировать ruleStore во время тестирования?Я не могу понять, как внедрить мой фиктивный RuleStore в Spring и в систему автоматической разводки.

Спасибо

Ответы [ 3 ]

15 голосов
/ 29 ноября 2012

Это довольно просто с Mockito :

@RunWith(MockitoJUnitRunner.class)
public class RuleIdValidatorTest {
    @Mock
    private RuleStore ruleStoreMock;

    @InjectMocks
    private RuleIdValidator ruleIdValidator;

    @Test
    public void someTest() {
        when(ruleStoreMock.doSomething("arg")).thenReturn("result");

        String actual = ruleIdValidator.doSomeThatDelegatesToRuleStore();

        assertEquals("result", actual);
    }
}

Подробнее о @ InjectMocks в Javadoc Mockito или в сообщении блога что я писал об этой теме некоторое время назад.

Доступно для Mockito 1.8.3, улучшено в 1.9.0.

10 голосов
/ 07 января 2011

Вы можете использовать что-то вроде Mockito, чтобы смоделировать хранилище правил, возвращенное во время тестирования Этот пост Stackoverflow имеет хороший пример этого:

Пружина 3, проверка электропроводки и джунта

2 голосов
/ 21 марта 2013

Вы можете сделать следующее:

package com.mycompany;    

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

@Component
@DependsOn("ruleStore")
public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {

    @Autowired
    private RuleStore ruleStore;

    // Some other methods
}

И ваш весенний контекст должен выглядеть так:

<context:component-scan base-package="com.mycompany" />

<bean id="ruleStore" class="org.easymock.EasyMock" factory-method="createMock">
    <constructor-arg index="0" value="com.mycompany.RuleStore"/>
</bean>
...