代理对象的mock
demo类定义如下:
public class Handler implements InvocationHandler {private SetBeanBInterface setBeanB;public Handler(SetBeanBInterface b) {this.setBeanB = b;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("0000000");return method.invoke(setBeanB, args);}
}
@Service
public class SetBeanA implements SetBeanAInterface {private SetBeanBInterface setBeanB; // 实际值是setSetBeanB里设置的代理对象@Overridepublic void ffun() {System.out.println(setBeanB.fun());}@Autowiredpublic void setSetBeanB(SetBeanBInterface setBeanB) {this.setBeanB = (SetBeanBInterface) Proxy.newProxyInstance(setBeanB.getClass().getClassLoader(),setBeanB.getClass().getInterfaces(), new Handler(setBeanB));}
}
public interface SetBeanBInterface {String fun();
}
@Service
public class SetBeanB implements SetBeanBInterface {@Overridepublic String fun() {return "12345";}
}
// testng + @Mock + @InjectMocks
@SpringBootTest // 启动完整 SpringBoot 应用上下文
public class SetBeanTest extends AbstractTestNGSpringContextTests {@BeforeClass // 这里和 @TestExecutionListeners(MockitoTestExecutionListener.class) 二选一即可public void init() {MockitoAnnotations.openMocks(this);}@InjectMocksprivate SetBeanA setBeanA;@Mockprivate SetBeanBInterface setBeanBInterface;@Testpublic void test1() {// 设置 mockB 的行为when(setBeanBInterface.fun()).thenReturn("mocked result");setBeanA.ffun();}
}
测试类
// testng + @Mock + @InjectMocks
@SpringBootTest // 启动完整 SpringBoot 应用上下文
public class SetBeanTest extends AbstractTestNGSpringContextTests {@BeforeClass // 这里和 @TestExecutionListeners(MockitoTestExecutionListener.class) 二选一即可public void init() {MockitoAnnotations.openMocks(this);}@InjectMocksprivate SetBeanA setBeanA;@Mockprivate SetBeanBInterface setBeanBInterface;@Testpublic void test1() {// 设置 mockB 的行为when(setBeanBInterface.fun()).thenReturn("mocked result");setBeanA.ffun();}
}
输出:0000000 (表示走进了代理逻辑)
mocked result (表示被代理的对象被mock成功了)