TestableMock在使用时仍然会加载环境配置,如果有未mock的方法,在运行测试类时会真实执行
如果存在未mock的方法,会在测试类执行时候真实的执行代码逻辑,有什么方法可以避免这种情况吗?在powermock中是依靠@PrepareForTest注解和@Mock等注解配合实现的,但是在TestableMock中注解好像不适用
目前没有实现这种功能。
两者实现思路不太一样,PowerMock是Mock被测类中的特定对象(以及对象中的所有方法),TestableMock是单独Mock被测类中的特定方法调用。从实现而言就是替换整个对象 vs 替换单个方法,这个差异使得TestableMock更加轻量,但无法做默认所有方法都是Mock这个功能,因为没有对象作为方法范围的边界。
理论上而言,TestableMock的机制能做到譬如“调用指定类型对象的所有方法默认换成Mock”的功能,近似于PowerMock的Mock对象。但这么做会使得Mock方法的生效逻辑变复杂,偏离简单易用的初衷。
目前没有实现这种功能。
两者实现思路不太一样,PowerMock是Mock被测类中的特定对象(以及对象中的所有方法),TestableMock是单独Mock被测类中的特定方法调用。从实现而言就是替换整个对象 vs 替换单个方法,这个差异使得TestableMock更加轻量,但无法做默认所有方法都是Mock这个功能,因为没有对象作为方法范围的边界。
理论上而言,TestableMock的机制能做到譬如“调用指定类型对象的所有方法默认换成Mock”的功能,近似于PowerMock的Mock对象。但这么做会使得Mock方法的生效逻辑变复杂,偏离简单易用的初衷。
那该如何避免由于没有mock替换个别方法,导致上线过程中执行测试用例影响而到真实数据呢?例如insert或者update类似会影响到数据库或是其他真实数据的操作
对于明确是需要Mock某个对象的场景,Mockito、PowerMock的实现方式会更适合一些。
TestableMock也可以与Mockito共同使用,使用Mockito生成代理对象对象,作为Mock方法的返回值或是用于替换被测类中的成员对象。生成Mock对象方面的轮子在社区里已经比较多了,不太需要重新造。
单元测试通常应该在本地和测试环境运行,即使测试对象的方法全部是Mock的,也不建议连到线上环境跑测试,否则稍微疏忽就容易出大问题的。
近期连续收到较多类似问题的反馈🤣
计划在1.0版本之前会加上“调用指定类所有方法自动Mock”的新注解@MockAllMethods,相关设计已完成,待开发。