我正在尝试使用
的原理来测试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,到上下文等的任何内容(尤其是在我没有写过自己的班级的情况下) )
解决方案是:
- 将您的静态实用程序类包装在模拟对象中。
- 而不是调用正在测试的系统(SUT)中的静态易变,而是通过对包装类的依赖性。
- 在测试的
@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();
}