From afecf4ddf557a8603f15d46346853d8d77703740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=91=E6=88=9F?= Date: Tue, 27 Oct 2020 23:02:31 +0800 Subject: [PATCH] add faq and known issue doc --- docs/frequency-asked-questions.md | 10 ++++++++++ docs/known-issues.md | 23 +++++++++++++++++++++++ docs/{ReleaseNote.md => release-note.md} | 5 +++++ docs/{Usage.md => usage.md} | 14 ++++++++++---- 4 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 docs/frequency-asked-questions.md create mode 100644 docs/known-issues.md rename docs/{ReleaseNote.md => release-note.md} (89%) rename docs/{Usage.md => usage.md} (88%) diff --git a/docs/frequency-asked-questions.md b/docs/frequency-asked-questions.md new file mode 100644 index 0000000..c81c957 --- /dev/null +++ b/docs/frequency-asked-questions.md @@ -0,0 +1,10 @@ +常见用户问题 +--- + +**1. 如何Mock被测类中通过`@Autowired`初始化的字段?** + +直接创建被测类对象,然后利用`Testable`访问私有成员的能力直接给这些字段赋值即可。 + +**2. 通过接口对象或基类对象指向派生类的实例,调用执行了派生类实现的方法。使用`@TestableMock`定义Mock方法时,首个参数类型应该用 接口/基类 还是 派生类?** + +应该使用 接口/基类 类型,参见`should_able_to_mock_override_method`测试用例。 diff --git a/docs/known-issues.md b/docs/known-issues.md new file mode 100644 index 0000000..3776ce4 --- /dev/null +++ b/docs/known-issues.md @@ -0,0 +1,23 @@ +已知问题 +--- + +**1. 访问私有方法或私有成员代码在IDE提示语法错误** + +使用`@EnablePrivateAccessor`注解后访问私有方法或成员变量,虽然能正常通过编译,但在IDE上依然会提示语法错误。 +这个问题与使用`Lombok`工具库后使用生成的`getter`和`setter`会被IDE报语法错误一样,需要通过IDE插件来解决。 +当前`Testable`尚未提供相关插件。也可以改用`PrivateAccessor`工具类来访问私有成员,来避免IDE的异常信息。 + +**2. 通过IDE运行单个测试用例时,Mock功能失效** + +这是由于IDE运行单个测试用例时只会运行`maven-surefire-plugin`插件,跳过了`testable-maven-plugin`插件执行,导致Mock功能所需的JavaAgent没有随测试启动。 + +解决方法是在单元测试配置的"虚拟机参数(VM Option)"属性值末尾添加JavaAgent启动参数:`-javaagent:${HOME}/.m2/repository/com/alibaba/testable/testable-agent/0.2.1/testable-agent-0.2.1.jar` + +> PS:请将路径中的版本号替换成实际使用的版本号 + +![idea-vm-option](https://testable-code.oss-cn-beijing.aliyuncs.com/idea-vm-option.png) + +**3. Testable的`verify`方法只能验证调用次数,不能验证调用参数** + +当前版本尚未实现对调用参数的验证功能,欢迎贡献代码。 + diff --git a/docs/ReleaseNote.md b/docs/release-note.md similarity index 89% rename from docs/ReleaseNote.md rename to docs/release-note.md index 9d15d48..2b3bb0a 100644 --- a/docs/ReleaseNote.md +++ b/docs/release-note.md @@ -1,5 +1,10 @@ # Release Note +## v0.2.1 +- support mock static method +- support mock kotlin companion object method +- support mock invoke by interface / base class object + ## v0.2.0 - use `TestableTool` class to expose test context and verify mock invoke - add `testable-maven-plugin` module to simplify javaagent configuration diff --git a/docs/Usage.md b/docs/usage.md similarity index 88% rename from docs/Usage.md rename to docs/usage.md index 3a3bb8b..439dec6 100644 --- a/docs/Usage.md +++ b/docs/usage.md @@ -55,7 +55,7 @@ ### Mock被测类的任意方法调用 -**【1】覆写任意类的方法调用** +**1. 覆写任意类的方法调用** 在测试类里定义一个有`@TestableMock`注解的普通方法,使它与需覆写的方法名称、参数、返回值类型完全一致,然后在其参数列表首位再增加一个类型为该方法原本所属对象类型的参数。 @@ -65,7 +65,7 @@ 示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_common_method()`用例详细展示了这种用法。 -**【2】覆写被测类自身的成员方法** +**2. 覆写被测类自身的成员方法** 有时候,在对某些方法进行测试时,希望将被测类自身的另外一些成员方法Mock掉。 @@ -73,7 +73,13 @@ 详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_member_method()`用例。 -**【3】覆写任意类的new操作** +**3. 覆写任意类的静态方法** + +对于静态方法的Mock与普通方法相同。但需要注意的是,对于静态方法,传入Mock方法的第一个参数实际值始终是`null`。 + +详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_static_method()`用例。 + +**4. 覆写任意类的new操作** 在测试类里定义一个有`@TestableMock`注解的普通方法,将注解的`targetMethod`参数写为"",然后使该方法与要被创建类型的构造函数参数、返回值类型完全一致,方法名称随意。 @@ -81,7 +87,7 @@ 详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_new_object()`用例。 -**【4】识别当前测试用例和调用来源** +**5. 识别当前测试用例和调用来源** 在Mock方法中可以通过`TestableTool.TEST_CASE`和`TestableTool.SOURCE_METHOD`来识别**当前运行的测试用例名称**和**进入该Mock方法前的被测类方法名称**,从而区分处理不同的调用场景。