demo类定义如下:
public class Handler implements InvocationHandler {
private SetBeanBInterface setBeanB;
public Handler(SetBeanBInterface b) {
this.setBeanB = b;
}
@Override
public 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里设置的代理对象
@Override
public void ffun() {
System.out.println(setBeanB.fun());
}
@Autowired
public 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 {
@Override
public String fun() {
return "12345";
}
}
// testng + @Mock + @InjectMocks
@SpringBootTest // 启动完整 SpringBoot 应用上下文
public class SetBeanTest extends AbstractTestNGSpringContextTests {
@BeforeClass // 这里和 @TestExecutionListeners(MockitoTestExecutionListener.class) 二选一即可
public void init() {
MockitoAnnotations.openMocks(this);
}
@InjectMocks
private SetBeanA setBeanA;
@Mock
private SetBeanBInterface setBeanBInterface;
@Test
public 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);
}
@InjectMocks
private SetBeanA setBeanA;
@Mock
private SetBeanBInterface setBeanBInterface;
@Test
public void test1() {
// 设置 mockB 的行为
when(setBeanBInterface.fun()).thenReturn("mocked result");
setBeanA.ffun();
}
}
输出:0000000 (表示走进了代理逻辑)
mocked result (表示被代理的对象被mock成功了)
622

被折叠的 条评论
为什么被折叠?



