Весеннее ИТ-тестирование - не может быть подклассом финального класса - PullRequest
0 голосов
/ 23 сентября 2019

Это мой класс обслуживания:

@Validated
public final class SenderImpl implements Sender {

  private static final Logger LOGGER = LoggerFactory.getLogger(SenderImpl.class);

  private final ExchangeService exchangeService;
  private final IntegratorService integratorService;

  @Autowired
  public SenderImpl(ExchangeService exchangeService, IntegratorService integratorService) {
    this.exchangeService = exchangeService;
    this.integratorService = integratorService;
  }

  @Override
  public String send(@NotNull String rawData, @NotNull String channelName) throws ClientException {
    (...)

    return rawMessage;
  }
}

А вот мой ИТ-тест для этого класса, где мне нужно автоматически подключиться ApplicationContext :

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class SenderTestIT {

  @Autowired
  private ApplicationContext applicationContext;

  @Autowired
  private Sender sender;

  @MockBean
  private SecurityHelper securityHelper;

  @Before
  public void setup() {
    (...)
  }

  @Test
  public void testSending() throws ClientException {
    // given

    // when
    String response = sender.send("...", "...");

    // then
    assertThat(response).isNotNull();
  }
}

Послепоявляется следующая ошибка:

Caused by: java.lang.IllegalArgumentException: Cannot subclass final class com.projects.pl.services.SenderImpl
    at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:565)
    at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
    at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at org.springframework.aop.framework.CglibAopProxy$ClassLoaderAwareUndeclaredThrowableStrategy.generate(CglibAopProxy.java:1004)
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:329)
    at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:492)
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)

Возможно, это вызвано модификатором final в моем классе SenderImpl .Это хороший подход?Если да, то какой обходной путь для этого?

1 Ответ

0 голосов
/ 23 сентября 2019

Не делайте ваш класс SenderImpl окончательным.

Ваша трассировка журнала показывает, что Spring использует CGLIB.

CGLIB будет расширяться SenderImpl для создания прокси.

И для работы CGLIB необходимо, чтобы ваши занятия не были окончательными.

Таким образом, исключение

Cannot subclass final class com.projects.pl.services.SenderImpl

Подробнее о CGLIB можно прочитать здесь

...