【问题标题】:Prevent AOP(AspectJ) code to be triggered while running test防止在运行测试时触发 AOP(AspectJ) 代码
【发布时间】:2019-08-08 13:31:28
【问题描述】:

在我的 spring boot 项目中,我使用MockMVC 来测试控制器(web)层。但是我的项目中也有 AOP(AspectJ) 逻辑,当我使用 MockMVC 为控制器运行单元测试时,测试也会触发 AOP 代码,如何防止在为控制器运行单元测试时触发 AOP 代码?

@Test
public void testMyControllerMethod() {
   ...

   // myRequest hits an endpoint function of my controller, there is also AOP intercept the function call, how can I disable AOP to be triggered while running test?
   mockMVC.perform(myRequest).andExpect(okStatus)

}

问题在我的代码注释中:)

我查过this answer,我知道使用if() 表达式,但是我没有得到TestMode.ACTIVE,Spring boot 中没有这样的东西。如果有人可以让我知道如何检查代码是否在运行时运行单元测试,我也会知道如何防止 AOP 逻辑运行。

【问题讨论】:

  • 是的,但答案对我不起作用,例如我怎么知道代码在测试模式下运行?那个回答提到TestMode.ACTIVE,不知道从哪里来的,spring boot中没有TestMode类。
  • 这是您在测试中设置的全局变量。方面必须检查这个变量。这是一个手动解决方案,而不是来自 Spring
  • 您能否提供一个简单的 glable 变量的骨架示例?放在哪里以及在哪里更新值?
  • public final boolean TestMode.ACTIVE = false;并在测试中设置 TestMode.ACTIVE = true;

标签: spring-boot aspectj spring-aop


【解决方案1】:

正如西蒙已经尝试向您解释的那样,我在另一个答案中的意思是这样的:

package de.scrum_master.app;

public class TestMode {
  public static boolean ACTIVE = false;
}

但实际上我还列出了一些其他选项,例如环境变量和系统属性。如果我是你,我会使用其中之一,因为在你的 Maven 或 Gradle 构建中,通过配置设置属性或环境变量会非常容易。您的if() 切入点可以访问这些变量。


特别是在 Spring 的上下文中,还有一个更简单的选项:测试应用程序配置。只需为您的测试提供一个没有方面的配置。这样你就可以有不同的配置了

  • 生产环境,
  • 单元测试(无方面),
  • 集成测试(例如,具有方面但不同于单元测试和生产)。
  • 等等。

这里的优点是您不需要任何if() 切入点或将任何其他有关测试/生产环境的知识构建到您的方面,这非常难看。我的另一个答案只显示了您可以做什么,并没有说这是最好的解决方案。

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2019-01-30
    相关资源
    最近更新 更多