Fan Lin

Results 91 comments of Fan Lin

暂时不计划支持。 从Testable先前推广过程里的反馈来看,比较显著的问题是将Mock与测试用例解耦以后,一方面测试的代码确实会变得更干净,另一方面在阅读测试代码的时候,对于理解哪些地方会被Mock也会变得不太直观。 太过灵活就会带来代码可读性的下降,因此Testable在设计Mock方法复用机制的时候也相对克制。如果一个业务类能关联多个Mock类,再加上继承复用的机制,虽然编写测试的时候会更方便,但在阅读代码的时候会很难快速找到到底有多少方法被Mock了,对于测试代码的长期维护是弊大于利的。

Android项目添加`jvmArgs`参数的方式稍有不同,见[使用文档](http://freyrlin.gitee.io/testable-mock/#/zh-cn/doc/setup)末尾处,先确认一下是否与这个问题有关。

原生JUnit在虚拟机里运行单元测试的这种不行,因为Android虚拟机用的字节码和标准JVM不一样。 一般来说Android项目都推荐用Robolectric来做单元测试,虚拟机运行单元测试每次等启动的时间太长了。

Robolectric+Testable 是确定可行的,而且Android项目推荐搭配Robolectric做单元测试,能省很多等虚拟机启动的时间

可以解决,但前提是要用到Robolectric,直接安卓虚拟机运行单元测试的话,因为安卓的字节码和标准JVM不一样,不支持。 近期会补充一个Android的Robolectric示例工程,到时候可以参考一下。

已增加`demo/android-demo`示例,可进入改目录通过`./gradlew build`运行。 这个示例是包含了`Robolectric`工具的,但如果不涉及Android的内置类,实测无需引入`Robolectric`。

你的分析是正确的。 从原理来说,当`omni.constructor.enhance.enable`配置开启以后,Testable就会为所有待构造的类自动加上一个参数为`java.lang.Void`的构造方法,用于避开原类型里可能导致抛异常的默认构造方法。由于这个修改必须在类型首次加载的时候进行,因而Testable无法等到执行`OmniConstructor.newInstance()`再来按需添加,默认会给所有类都加上,但遇到某些框架不允许类型有多个构造方法的时候就会出问题。 解决办法是在`testable.properties`配置文件里添加以下内容,显式指定不要处理ElasticSearch插件相关的类型: ```properties omni.constructor.enhance.pkgPrefix.excludes = org.elasticsearch.transport,org.elasticsearch.plugin ``` 具体可参考[全局运行参数](https://alibaba.github.io/testable-mock/#/zh-cn/doc/javaagent-args)文档。 这个问题我会近期补充到文档的[常见使用问题](https://alibaba.github.io/testable-mock/#/zh-cn/doc/frequently-asked-questions)里,在下个版本里也会增加对ElasticPlugin这种特例情况的适配。 感谢反馈。

`testable-agent.log`没有生成说明执行单元测试的时候`testable-agent.jar`包没有正确引入。 如果是Android项目,添加依赖的方式会稍有差异,参考[这篇](http://freyrlin.gitee.io/testable-mock/#/zh-cn/doc/setup)文档底部,这个方式是验证过可行的。用AS编译普通Gradle项目没试过是否可行。 我目前工作环境由于网络原因无法正常安装AS和Android SDK,不能进行验证,不妨先再尝试检查一下项目的`build.gradle`文件,只要让单元测试运行的时候`-javaagent:......`这个参数正常加上应该就没问题了。

估计是AS IDE直接用于普通Gradle项目(非Android项目)有些需要配置的地方。 可以先试试在命令行下,在`java-demo`目录,直接执行`gradle build`能否通过,如果正常的话,就可以排除Gradle原因,确定是AS配置问题。 > `-javaagent:....`这个你可以先忽略不管,这个意思是当Gradle里的配置正常生效时候,Gradle启动单元测试的命令里就会包含这么个参数,可以作为判断配置是否生效的依据。用比如`gradle build --debug`方式构建的话就会看到,不过从现在现象来看已经可以基本确定是配置没生效,不用看这个了。

如果是Android项目,由于运行单元测试所用的Gradle组件不同,`jvmArgs`参数的配置位置与普通Java项目是不太一样的,见[使用文档](http://freyrlin.gitee.io/testable-mock/#/zh-cn/doc/setup)末尾处的说明。 AS在Android项目中使用`TestableMock`是验证过可行的,在[issue-43](https://github.com/alibaba/testable-mock/issues/43)有一个旧版本示例代码,近期由于办公网络原因无法正常安装Android SDK,过段时间来补上一个最新的完整AS示例。 `demo/java-demo`是一个非Android的普通Java项目,可以用IntelliJ IDE运行。