gpt4 book ai didi

java - 如何模拟一个方面

转载 作者:行者123 更新时间:2023-11-28 19:49:23 25 4
gpt4 key购买 nike

我目前正在使用 aspectj 开发一些监控工具。因为这个工具应该是技术独立的(尽可能),所以我没有使用 Spring 进行注入(inject)。但我希望对我的方面进行单元测试。

切面示例:

@Aspect
public class ClassLoadAspect {
private Repository repository;

public ClassLoadAspect() {
repository = OwlApiRepository.getInstance();
}

@After("anyStaticInitialization()")
public void processStaticInitilization(JoinPoint jp) {
Class type = jp.getSourceLocation().getWithinType();
if (type.isInterface()) {
repository.storeInterfaceInitialization(type);
} else if (type.isEnum()) {
repository.storeEnumInitialization(type);
} else {
repository.storeClassInitialization(type);
}

}

@Pointcut("staticinitialization(*) && !within(cz.cvut.kbss.odra..*)")
public void anyStaticInitialization() {
}

public Repository getRepository() {
return repository;
}

public void setRepository(Repository repository) {
this.repository = repository;
}
}

但是,我真的不知道如何构建单元测试(应该模拟存储库字段(使用 mockito)),但是我没有控制方面的创建,因此我无法手动设置依赖项。我应该调用什么来获取实例?或者还有一些其他场景如何对 aspectj 方面进行单元测试。

谢谢。

最佳答案

您说您找到了自己的引入模拟对象的方式 hacky。你到底不喜欢什么,你认为它是怎样的?我只能猜测:

您是否不喜欢在元方面全局替换对 OwlApiRepository.getInstance() 的调用?然后您可以专门将模拟对象注入(inject)限制到方面的构造函数(我使用 native AspectJ 语法,因为我对 POJO 注释样式感到不舒服):

public privileged aspect ClassLoadTestAspect {
static boolean active = true;

declare precedence : ClassLoadTestAspect, ClassLoadAspect;
pointcut classLoadAspect() :
if(active) &&
withincode(ClassLoadAspect.new()) &&
call(* OwlApiRepository.getInstance());

Object around() : classLoadAspect() {
return new MockRepository();
}
}

正如您还看到的,元(方面测试)方面的这种变体也有一个开关可以随意打开和关闭它。也许这也是你不喜欢的事情。正如我所说,我在猜测。在收到您的反馈后,我也许可以更具体地回答。

编辑:至于您的顾虑,我想我已经尽可能解决了:

  • 您不需要模拟支架。

  • 可以(取消)激活该方面。很容易使其激活依赖于其他条件,因此它仅在您的测试环境中处于 Activity 状态。如果这还不够,请在生产方面使用编译时织入,在测试方面使用加载时织入。这样它的字节码甚至不会出现在您的生产环境中。

  • 我的版本不会全局替换任何东西,但就像一位优秀的外科医生只会在一个地方以微创方式切开。

  • 出于以下几个原因,我无法真正理解您对字节码操作的担忧:您使用 AspectJ,即固有的字节码操作(编织)。您使用在运行时创建类的 Mockito。我也不明白您在哪里看到 AspectJ 的缺陷。您还没有解释您希望“语言的标准方式”如何运行或它应该为测试提供什么接口(interface)。即使你有,我也不能为你改变你自己选择的语言(AJ)和工具(Mockito)。

关于java - 如何模拟一个方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11825325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com