spring 如何对Aspect注解进行单元测试

myzjeezk  于 2023-04-28  发布在  Spring
关注(0)|答案(1)|浏览(302)

我已经定义了一个Aspect,当方法被注解时将使用它。请看下面的示例代码

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PredefinedCheck {

}

@Aspect
@Component
public class PredefinedAspect {
    
    @Before("@annotation(PredefinedCheck)")
    @SneakyThrows
    public void check(JoinPoint joinPoint) {

        ......
        log.debug("hello!!");
    }
}

@Service
public class ActionService {
     
     @PredefinedCheck
     public MyEntity updateMyEntity(AuthenticationJwtToken authToken, EntityUpdateRequest request) {
          ......
     }
}

现在,问题是如何对我的PredefinedAspect代码进行单元测试?我以为单元测试updateMyEntity方法会触发它,但它没有(我调试过,它没有达到断点)。此外,sonarqube不显示所覆盖的代码)。请指示。

hsvhsicv

hsvhsicv1#

步骤

1.在src/test/ root项目下创建SpringBootApplication类,它将启动上下文(加载/注册AOP)以进行测试。

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackageClasses = { PredefinedAspect.class } )
public class ApplicationTest {
    public void main(String args[]) {
        SpringBootApplication.run(ApplicationTest.class, args);
    }
}

1.使用SprintBootTest注解启用测试,并在上面的Application上下文中使用。

@SpringBootTest(classes = ApplicationTest.class)

1.如果您的项目启用了某些配置,例如Hibernate / Database,而您不感兴趣测试它,请使用EnableAutoConfiguration注解排除。例如:

@EnableAutoConfiguration(exclude = {
        DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,
        JpaRepositoriesAutoConfiguration.class
})

完整示例:

import org.aspectj.lang.JoinPoint;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.stereotype.Service;
import org.springframework.test.context.junit4.SpringRunner;

import javax.sql.DataSource;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

@Service
class ActionServiceFake {
    @PredefinedCheck
    public MyEntity updateMyEntity(AuthenticationJwtToken authToken, EntityUpdateRequest request) {
    }
}

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationTest.class)
@EnableAutoConfiguration(exclude = {
        DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,
        JpaRepositoriesAutoConfiguration.class
})
public class PredefinedAspectTest {
    @SpyBean
    PredefinedAspect predefinedAspect;

    @Autowired
    ActionServiceFake actionServiceFake;

    @Test
    public void shouldCheckOneTimesBefore() {
        // exercise ...
        actionServiceFake.updateMyEntity(new AuthenticationJwtToken(), new EntityUpdateRequest());

        // expectation ...
        verify(predefinedAspect, times(1)).check(any(JoinPoint.class));
    }
}

您可以使用外部ActionService类,但是不要忘记将其添加到Application Context基类列表中。

相关问题