适当测试Android中的静态方法



我正在尝试使用

的原理来测试Android应用
  • 直接测试公共方法
  • 测试私人方法作为测试公共方法的副作用
  • 测试静态方法独立

因此

但是,在这种情况下测试公共方法时,我处于摊位

public class ClassA {
    public void publicMethod(String id) {
        // something
        privateMethod(id);
    }
    public void privateMethod(String id) {
        // something
        StaticClass.staticMethod(id);
    }
}

因为在这里我可以为PublicMethod编写测试,但后来我遇到了问题

  • 如何防止staticclass.staticmethod开火(嘲笑其行为/响应)?因为该方法可以内部触摸从数据库到httpconnections,到上下文等的任何内容(尤其是在我没有写过自己的班级的情况下)

解决方案是:

  1. 将您的静态实用程序类包装在模拟对象中。
  2. 而不是调用正在测试的系统(SUT)中的静态易变,而是通过对包装类的依赖性。
  3. 在测试的@Before方法中,用模拟的包装类调用SUT的构造函数。

这符合OOP封装原理(BTW静态类可能会破裂)。示例:

class WrappedStaticClass {
    void wrappedStaticMethod() {
        StaticClass.staticMethod();
    }
}

您的重构ClassA现在看起来像这样:

public class ClassA {
    private final WrappedStaticClass wrappedStaticClass;
    public ClassA(WrappedStaticClass wrappedStaticClass) {
        this.wrappedStaticClass = wrappedStaticClass;
    }    
    public void publicMethod(String id) {
        // something
        privateMethod(id);
    }
    private void privateMethod(String id) {
        // something
        wrappedStaticClass.wrappedStaticMethod(id);
    }
}

您的测试现在看起来像这样:

@Mock WrappedStaticClass mockWrappedStaticClass;
//system under test
ClassA classA;
@Before
public void setUp() {
    MockitoAnnotations.init(this);
    classA = new ClassA(mockWrappedStaticClass);
}
@Test
public void testCallsWrappedStaticClass() {
    //act
    classA.publicMethod(1);
    //assert
    verify(mockWrappedStaticClass).wrappedStaticMethod();
}

相关内容

  • 没有找到相关文章

最新更新