这里栈长以 Maven 为示例集成使用 TestableMock,Gradle 版本请参考官方文档。另外,关注公众号Java技术栈,在后台回复:Maven,可以获取我整理的 Maven 系列教程,非常齐全。
增加一个类,调用任意方法、成员方法、静态方法:
/** * @from 公众号:Java技术栈 * @author 栈长 */ public class TestableMock { /** * 调用任意方法 */ public String commonMethod() { return " www ".trim() + "." + " javastack".substring(1) + "www.javastack.cn".startsWith(".com"); } /** * 调用成员、静态方法 */ public String memberMethod(String s) { return "{ \"result\": \"" + innerMethod(s) + staticMethod() + "\"}"; } private static String staticMethod() { return "WWW_JAVASTACK_CN"; } private String innerMethod(String website) { return "our website is: " + website; } }增加单元测试类:
import com.alibaba.testable.core.annotation.MockMethod; import org.junit.jupiter.api.Test; import static com.alibaba.testable.core.matcher.InvokeVerifier.verify; import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author 栈长 * @from 公众号:Java技术栈 */ class TestableMockTest { private TestableMock testableMock = new TestableMock(); /** * Mock 任意方法 * @return */ @MockMethod(targetClass = String.class) private String trim() { return "http://www"; } @MockMethod(targetClass = String.class, targetMethod = "substring") private String substr(int i) { return "javastack.cn_"; } @MockMethod(targetClass = String.class) private boolean startsWith(String website) { return false; } /** * Mock 成员方法 * @param text * @return */ @MockMethod(targetClass = TestableMock.class) private String innerMethod(String text) { return "mock_" + text; } /** * Mock 静态方法 * @return */ @MockMethod(targetClass = TestableMock.class) private String staticMethod() { return "_MOCK_JAVASTACK"; } @Test void commonMethodTest() { assertEquals("http://www.javastack.cn_false", testableMock.commonMethod()); verify("trim").withTimes(1); verify("substr").withTimes(1); verify("startsWith").withTimes(1); } @Test void memberMethodTest() { assertEquals("{ \"result\": \"mock_hello_MOCK_JAVASTACK\"}", testableMock.memberMethod("hello")); verify("innerMethod").withTimes(1); verify("staticMethod").withTimes(1); verify("innerMethod").with("hello"); verify("staticMethod").with(); } }在以上单元测试类中,以 @MockMethod 注解标识的方法都是 Mock 方法,Mock 了任意方法、成员方法、静态方法。
使用确实很简单,非常灵活,功能也确实比动态代理那种要强大,一个 @MockMethod 注解走天下,可以扔掉其他的 Mock 工具了。
参考文档:
https://github.com/alibaba/testable-mock
https://alibaba.github.io/testable-mock/
版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。
近期热文推荐:
1.Java 15 正式发布, 14 个新特性,刷新你的认知!!
2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!
3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!