如何对具有某物状态条件的函数进行单元测试



我正在尝试为具有wifi状态条件的函数编写单元测试。当 wifi 状态断开连接时,函数返回 false,但我想模拟连接 wifi 状态时的场景。我该怎么做?我应该为状态变量创建一个设置器吗?这不是一个糟糕的方法吗?

我要测试的功能:

public boolean performSomething() {
    if (WIFI_STATE != "connected") {
        return false;
    }else{
          ....
    }
}

我想测试上面函数的 else 部分,但正如您可能已经猜到的那样,该函数执行 if 条件,并返回 false,因为WIFI_STATE"断开连接">

在没有看到任何代码的情况下,请确保您的类使用 WifiState 构造函数参数或注入(或类似的东西(。 然后,在测试中,您可以为此对象提供模拟,并根据测试需求设置状态。

我能想到的两种方法:

1:定义传感器的状态捕获类,例如 WifiStatus,生产代码通过静态初始值设定项自动初始化该类。

对于测试,可以通过测试初始值设定项加载虚拟 WifiStatus 类,或通过检测更改 WifiStatus 的值。

2:使用WifiStatus作为接口,然后模拟它进行依赖注入。这种方法更常见。

public interface WifiStatus{
    boolean isConnected();//
}
public class Performer{
    WifiStatus wifiStatusProvider;
    public Performer(WifiStatus stateProvider){
        this.wifiStatusProvider = stateProvider;
    }
    public boolean performSomething() {
        //if (WIFI_STATE != "connected") {
        if (wifiStatusProvider.isConnected() != true) {            
            return false;
        }else{
            ....
        }
    }
}

对于测试类,您可以按如下方式使用:

public class PerformerTest{
    @Test
    public void verifyPerformSomething(){
        WifiStatus dummyWifiStatus = mock(WifiStatus.class);
        doReturn(true).when(dummyWifiStatus).isConnected();
        new Performer(dummyWifiStatus).performSomething();
    }
}

假设您谈论的是"本地单元测试"而不是"插桩单元测试",则可以使用Robolectric:http://robolectric.org

http://robolectric.org/javadoc/3.0/org/robolectric/shadows/ShadowWifiManager.html

https://github.com/robolectric/robolectric/blob/master/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiManagerTest.java

本地单元测试:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html

插桩单元测试:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html

好吧,为了进行测试,您必须确保输入的输出是什么样子的,因为您需要比较它们。让wifi状态的布尔值是从外部注入的,所以你可以随心所欲地模拟它。例如:

public boolean method(boolean wifiState){
   return !wifiState;
}
所以现在你可以确定,如果你的参数

是假的,你会得到真,反之亦然,所以你可以模拟这个参数并进行测试。

基于 john16384 的答案提供基于代码的答案。你提到状态是用同一个类中的其他函数设置的,假设这些方法是公共的,我提出这样的东西(假设WifiChecker是你的类(:

private WifiChecker wifiChecker;
@Before public void setUp() {
    wifiChecker = new WifiChecker();
}
@Test public void testWifiConnected() {
    wifiChecker.setConnected()
    assertTrue(wifiChecker.performSomething());
}
@Test public void testWifiDisconnected() {
    wifiChecker.setDisconnected()
    assertFalse(wifiChecker.performSomething());
}

相关内容

  • 没有找到相关文章

最新更新