spring - Spring IT 测试 - 不能子类化最终类
问题描述
这是我的服务类:
@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的此类的 IT 测试:
@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修饰符引起的。这是好方法吗?如果是,那么解决方法是什么?
解决方案
不要让你的SenderImpl
课程结束。
您的日志跟踪显示 Spring 正在使用CGLIB
.
CGLIB
将扩展SenderImpl
以进行代理。
工作的要求CGLIB
是让你的课程不是最终的。
因此异常
Cannot subclass final class com.projects.pl.services.SenderImpl
您可以在此处阅读有关 CGLIB的更多信息
推荐阅读
- java - 如何使用正则表达式解析自定义版本号方案?
- mysql - 仅显示某些值的最低价格的 Mysql 查询不起作用
- twilio - 将显示名称传递给 SIP 客户端
- java - 数据压缩算法:压缩字符串
- jquery - 如何使用数组名称序列化Array()
- vue.js - Vuetify list : 根据活动路由打开组
- mysql - 如果字段为空,MySQL如何选择字段或设置为空?
- python - AWS - S3 - 创建存储桶策略 - 错误:拒绝访问
- logging - 自定义负载值的基于 GCP Stackdriver 日志的指标
- android - Robolectric 需要 Java 9 吗?