Java 模拟过程连接点签名

Java 模拟过程连接点签名,java,spring,mocking,aspectj,mockito,Java,Spring,Mocking,Aspectj,Mockito,我试图模拟一个ProceedingJoinPoint类,但我很难模拟一个方法 下面是调用模拟类的代码: ... // ProceedingJoinPoint joinPoint Object targetObject = joinPoint.getTarget(); try { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMet

我试图模拟一个ProceedingJoinPoint类,但我很难模拟一个方法

下面是调用模拟类的代码:

...
// ProceedingJoinPoint joinPoint

Object targetObject = joinPoint.getTarget();
try {

  MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  Method method = signature.getMethod();

  ...
  ...
这是我到目前为止模拟课堂的尝试

accountService = new AccountService();
ProceedingJoinPoint joinPoint = mock(ProceedingJoinPoint.class);
when(joinPoint.getTarget()).thenReturn(accountService);
我现在不知道如何模拟签名来获得什么样的方法

when(joinPoint.getSignature()).thenReturn(SomeSignature); //???

有什么想法吗?

好吧,你可以模拟
MethodSignature
类,但我想你应该进一步模拟它,以返回
方法
类实例。因为
方法
是最终的,所以它不能被扩展,因此不能被模仿。您应该能够在测试类中创建一个伪方法来表示您的“模拟”方法。我通常是这样做的:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;

import java.lang.reflect.Method;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class MyTest {
    AccountService accountService;

    @Test
    public void testMyMethod() {
        accountService = new AccountService();

        ProceedingJoinPoint joinPoint = mock(ProceedingJoinPoint.class);
        MethodSignature signature = mock(MethodSignature.class);

        when(joinPoint.getTarget()).thenReturn(accountService);
        when(joinPoint.getSignature()).thenReturn(signature);
        when(signature.getMethod()).thenReturn(myMethod());
        //work with 'someMethod'...
    }

    public Method myMethod() {
        return getClass().getDeclaredMethod("someMethod");
    }

    public void someMethod() {
        //customize me to have these:
        //1. The parameters you want for your test
        //2. The return type you want for your test
        //3. The annotations you want for your test
    }
}