gpt4 book ai didi

java - 在 Android 中正确测试静态方法

转载 作者:搜寻专家 更新时间:2023-11-01 09:31:55 24 4
gpt4 key购买 nike

我正在尝试使用以下原理测试 Android 应用

  • 直接测试公共(public)方法
  • 测试私有(private)方法作为测试公共(public)方法的副作用
  • 独立测试静态方法

出于这个原因,我只想依赖 JUnit 和 Mockito 进行测试,而不是冒险滥用 PowerMockito 等框架

但是在这种情况下测试公共(public)方法时我陷入了困境

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

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

因为在这里我可以为publicMethod写一个测试,但是接下来我要面对问题

  • 如何防止 StaticClass.staticMethod 触发(模拟其行为/响应)?因为该方法可以在内部触及从 DB 到 HttpConnections 到 Context 等任何东西(特别是如果它来 self 自己没有编写的类)

最佳答案

解决方案是:

  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();
}

关于java - 在 Android 中正确测试静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46447338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com