testable-mock/docs/zh-cn/doc/upgrade-to-v05.md
2021-02-20 09:03:44 +08:00

2.3 KiB
Raw Blame History

升级到0.5版本

经过近一个月的设计和开发TestableMock的0.5版本终于和大家见面了。相比0.4版本,新版解决了此前遗留的三大历史问题:

  1. Mock方法无法调用其他非静态方法。新版中的Mock方法与普通方法不再有任何差别可以访问任意外部方法和成员变量。
  2. Mock方法总是作用于整个测试生命周期。从现在开始Mock方法支持将生效范围限定为所属测试类里的测试用例不用担心跨类测试调用被意外Mock掉了。
  3. 需手工清理MOCK_CONTEXT且只支持类粒度的并行测试。现在每个测试用例拥有了独立的MOCK_CONTEXT变量,无需清理也不会串号,而且可以放心使用任意粒度的并行单元测试啦。

在使用方式上,0.5版本延续TestableMock简洁轻量的原则同时为了更好的实现Mock方法复用新版本的Mock类与测试类之间有了明确的边界。从0.4版本升级到0.5唯一需要的改变是将测试类中的所有Mock方法使用一个public static class Mock { }包裹起来。

例如,原先有如下测试类定义:

public class DemoMockTest {
    @MockMethod(targetClass = DemoMock.class)
    private String innerFunc(String text) {
        return "hello_" + text;
    }
        
    @Test
    void should_able_to_mock_member_method() throws Exception {
        assertEquals("hello_world", demoMock.outerFunc());
        verify("innerFunc").with("world");
    }
}

升级为0.5版本后将所有Mock方法此例中只有innerFunc这一个方法)移到一个名称为Mock的静态内部类中,相当于增加两行代码:

public class DemoMockTest {

    public static class Mock {   // 增加此行
        @MockMethod(targetClass = DemoMock.class)
        private String innerFunc(String text) {
            return "hello_" + text;
        }
    }                            // 增加此行
        
    @Test
    void should_able_to_mock_member_method() throws Exception {
        assertEquals("hello_world", demoMock.outerFunc());
        verify("innerFunc").with("world");
    }
}

然后将pom.xmlbuild.gradle文件中的TestableMock依赖升级到0.5或以上版本即可。