微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Spring Boot中使用Junit / Mockito测试ByteBuddy ServiceImpl

如何解决在Spring Boot中使用Junit / Mockito测试ByteBuddy ServiceImpl

我们目前在使用Mockito作为测试框架的SpringBoot环境中测试ByteBuddy生成代码时遇到了问题。

问题可以描述如下。我们有一个通用的服务类和许多用例,其中该服务类的代码大约是90%相同,但是在一种初始化方法上有所不同。因此,我们决定不重复90%的代码,而是让ByteBuddy生成代码的子类来决定使用哪种初始化方法

有必要提及的是,由于其他情况,我们无法重组该特定服务以形成抽象类或委托或“正常”的东西。 ;-)

结果是,我们有多个由ByteBuddy生成的Spring bean,它们的init方法不同。一些伪代码可能会可视化它:

@Service
public class Service {

...many,many code equal to all ByteBuddy implementations....

public firstServiceInit() {
...
}

public secondServiceInit() {
...
}

现在,有一个配置类

@Configuration
public class ServiceConfiguration {

@Bean(value = "firstServiceImpl")
public Service createFirstServiceImpl() {
   ....ByteBuddy generated code subclassing Service class with init method "firstServiceInit()"
}

@Bean(value = "secondServiceImpl")
public Service createSecondServiceImpl() {
   ....ByteBuddy generated code subclassing Service class with init method "secondServiceInit()"
}

....and so on up to ten different deFinitions....

到目前为止,太好了。所有工作均按预期进行,我们针对特定情况使用ByteBuddy的解决方案似乎是正确的选择。

那有什么问题?

使用junit5 / Mockito测试不同的实现是问题所在。我们的问题是如何通过测试生成的类来实现。我们试图使它像这样工作:

@RunWith(powermockrunner.class)
@powermockrunnerDelegate(springrunner.class)
@SpringBoottest
@PowerMockIgnore({"javax.management.*","javax.net.ssl.*"})
public class ServiceTest  {
  
  @InjectMocks
  Service firstServiceImpl;

....

}

但是,Mockito仅创建Service类的“普通”定义实例,而不是通过ByteBuddy创建并在ServiceConfig类中定义的实例。

我们通过更改测试类上方的注释尝试了许多可能的配置,但没有成功。

因此,问题是:通常是否有可能使其在特定环境下工作?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。