package com.iailab.framework.datapermission.core.aop; import cn.hutool.core.collection.CollUtil; import com.iailab.framework.datapermission.core.annotation.DataPermission; import com.iailab.framework.test.core.ut.BaseMockitoUnitTest; import org.aopalliance.intercept.MethodInvocation; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import java.lang.reflect.Method; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; /** * {@link DataPermissionAnnotationInterceptor} 的单元测试 * * @author iailab */ public class DataPermissionAnnotationInterceptorTest extends BaseMockitoUnitTest { @InjectMocks private DataPermissionAnnotationInterceptor interceptor; @Mock private MethodInvocation methodInvocation; @BeforeEach public void setUp() { interceptor.getDataPermissionCache().clear(); } @Test // 无 @DataPermission 注解 public void testInvoke_none() throws Throwable { // 参数 mockMethodInvocation(TestNone.class); // 调用 Object result = interceptor.invoke(methodInvocation); // 断言 assertEquals("none", result); assertEquals(1, interceptor.getDataPermissionCache().size()); assertTrue(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable()); } @Test // 在 Method 上有 @DataPermission 注解 public void testInvoke_method() throws Throwable { // 参数 mockMethodInvocation(TestMethod.class); // 调用 Object result = interceptor.invoke(methodInvocation); // 断言 assertEquals("method", result); assertEquals(1, interceptor.getDataPermissionCache().size()); assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable()); } @Test // 在 Class 上有 @DataPermission 注解 public void testInvoke_class() throws Throwable { // 参数 mockMethodInvocation(TestClass.class); // 调用 Object result = interceptor.invoke(methodInvocation); // 断言 assertEquals("class", result); assertEquals(1, interceptor.getDataPermissionCache().size()); assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable()); } private void mockMethodInvocation(Class clazz) throws Throwable { Object targetObject = clazz.newInstance(); Method method = targetObject.getClass().getMethod("echo"); when(methodInvocation.getThis()).thenReturn(targetObject); when(methodInvocation.getMethod()).thenReturn(method); when(methodInvocation.proceed()).then(invocationOnMock -> method.invoke(targetObject)); } static class TestMethod { @DataPermission(enable = false) public String echo() { return "method"; } } @DataPermission(enable = false) static class TestClass { public String echo() { return "class"; } } static class TestNone { public String echo() { return "none"; } } }