【问题标题】:Spring IT testing - Cannot subclass final classSpring IT 测试 - 不能子类化最终类
【发布时间】:2019-09-23 08:06:48
【问题描述】:

这是我的服务类:

@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;
  }
}

这是我对这个类的 IT 测试,我需要自动装配 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)

这可能是由我的 SenderImpl 类中的 final 修饰符引起的。这是好方法吗?如果是,那么解决方法是什么?

【问题讨论】:

    标签: spring dependency-injection integration-testing inversion-of-control


    【解决方案1】:

    不要让你的 SenderImpl 类最终。

    您的日志跟踪显示 Spring 正在使用 CGLIB

    CGLIB 将扩展 SenderImpl 以创建代理。

    CGLIB 工作的要求是让你的课程不是最终的。

    因此例外

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

    您可以阅读更多关于 CGLIB here

    【讨论】:

    • 谢谢,那么可以为期末课程编写 IT 测试吗?
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 2018-03-24
    • 2019-05-15
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    相关资源
    最近更新 更多