Как я могу имитировать @Inject при вызове classes.methods? - PullRequest
0 голосов
/ 12 февраля 2020

Я хотел бы провести модульное тестирование класса, который получает конфигурацию, обычно создаваемую аннотацией @Inject из javax.inject.Inject.

Вместо этого я подумал об экземпляре конфигурации в начале теста, вызвав некоторые classes.methods. Это должно быть возможно, так как конструктор класса называется .

вместо

@Inject
@Named ("reportsprops")
protected Configuration reportsprops;

, описанный в META-INF.spring как:

<bean id="reportsprops"
    class="org.apache.commons.configuration.PropertiesConfiguration">
    <constructor-arg type="java.lang.String"
        value="file:${spr.root.dir}/reports.properties" />
    <property name="encoding" value="UTF-8" />
    <property name="throwExceptionOnMissing" value="true" />
    <property name="reloadingStrategy">
        <bean
            class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />
    </property>
</bean>

Я хочу использовать в модульном тесте что-то вроде:

Configuration reportsprops = a_direct_call_of_constructor 
or something similar, usable in test without running the server and things

Поскольку конфиг действительно великолепен, мне нужно заполнить его из файла, как его заполняет Spring, без насмешек над сотнями отдельных свойств. Что-то вроде

Beans.createClass (Configuration, beanPropertiesFile);

1 Ответ

0 голосов
/ 12 февраля 2020

Я предпочитаю использовать Mockito для выполнения инъекций за вас

@ExtendWith(MockitoExtension.class) // or @RunWith(MockitoJUnitRunner.class) for junit 4
class YourTest {
    @InjectMocks
    private YourTestedClass sut;

    // this is a mock that will get injected into the sut
    @Mock
    private Configuration yourConfig;

    @BeforeEach
    void mockConfigData() {
        when(yourConfig.getPropertyX()).thenReturn("value");
    }
}

Конечно, вы можете создать экземпляр Configuration и инициализировать его вручную.

class YourTest {
    private YourTestedClass sut;
    private Configuration configuration;

    @BeforeEach
    void initSut() {
        configuration = new Configuration();
        sut = new YourTestedClass(configuration);
    }
}
...