Выражение Spring-Retry не удалось в Junit4 - PullRequest
0 голосов
/ 05 января 2019

Сервис отлично работает с обычным приложением с весенней загрузкой. Но получаю исключение при работе джунит. Ниже приведены подробности моего исключения ...

    org.springframework.expression.spel.SpelEvaluationException: EL1001E: Type conversion problem, cannot convert from java.lang.String to java.lang.Integer
        at org.springframework.expression.spel.support.StandardTypeConverter.convertValue(StandardTypeConverter.java:75)
        at org.springframework.expression.common.ExpressionUtils.convertTypedValue(ExpressionUtils.java:57)
        at org.springframework.expression.common.LiteralExpression.getValue(LiteralExpression.java:92)
        at org.springframework.retry.annotation.AnnotationAwareRetryOperationsInterceptor.getRetryPolicy(AnnotationAwareRetryOperationsInterceptor.java:303)
        ...

        at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
        at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
        ...
org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at 
...
    Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Integer] for value '${max.read.attempts}'; nested exception is java.lang.NumberFormatException: For input string: "${max.read.attempts}"
        at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:46)
        at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:191)
        at org.springframework.expression.spel.support.StandardTypeConverter.convertValue(StandardTypeConverter.java:70)
        ... 41 more
    Caused by: java.lang.NumberFormatException: For input string: "${max.read.attempts}"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:569)
        at java.lang.Integer.valueOf(Integer.java:766)
        at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:210)
        at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:62)
        at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:49)
        at org.springframework.core.convert.support.GenericConversionService$ConverterFactoryAdapter.convert(GenericConversionService.java:436)
        at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:40)
        ... 43 more

В моем сервисе есть повторяющаяся метка, как показано ниже. Этот сервис был внедрен в Spring-boot rest apis. Но я хочу протестировать этот сервис отдельно.

@ Retryable (maxAttemptsExpression = "$ {max.read.attempts}", значение = {IOException.class}, backoff = @backoff (delayExpression = "$ {retry.delay}")))

И мой тестовый пример выглядит следующим образом.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ConfigInvokeServiceTest {

@Autowired
@Qualifier("configService")
ConfigInvokeService configInvokeService;

@Test
public void invoke() throws ClientProtocolException, IOException {
    String message = configInvokeService.invoke();
    verify(configInvokeService, times(3)).invoke();
    assertThat(message, is("Completed"));
}

@Configuration
@EnableRetry
public static class SpringConfig {
    @Bean(name = "configService")
    public ConfigInvokeService configInvokeService() throws Exception {
        ConfigInvokeService remoteService = mock(ConfigInvokeService.class);
        when(remoteService.invoke())
                .thenThrow(new RuntimeException("Remote Exception 1"))
                .thenThrow(new RuntimeException("Remote Exception 2"))
                .thenReturn("Completed");
        return remoteService;
    }
}
}

1 Ответ

0 голосов
/ 05 января 2019

Если это приложение Spring Boot, используйте @SpringBootTest, чтобы загрузочные свойства были загружены в ваш тестовый пример.

В противном случае вам нужно будет добавить PropertyPlaceHolderConfigurer @Bean к вашему SpringConfig вместе с указателем на файл свойств.

...