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

时间:2017-03-22 09:43:39

标签: java android unit-testing junit mockito

我试图为具有wifi状态条件的函数编写单元测试。当wifi状态断开时,该函数返回false,但我想模拟连接wifi状态时的场景。我该怎么办呢?我应该为状态变量设置一个setter吗?这不是一个坏方法吗?

我想测试的功能:

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

我想测试上面函数的else部分,但是你可能已经猜到了,该函数执行if条件,并返回false,因为WIFI_STATE是"断开"

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我能想到两种方法:

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

答案 2 :(得分:0)

答案 3 :(得分:0)

那么,对于测试,您必须确保输入的输出结果如何,因为您需要比较它们。使wifi状态的布尔值从外部注入,因此您可以按照自己喜欢的方式进行模拟。例如:

public boolean method(boolean wifiState){
   return !wifiState;
}

所以现在你可以肯定,如果你的参数是假的,你会得到真的,反之亦然,所以你可以模拟那个参数并进行测试。

答案 4 :(得分:0)

根据john16384's answer使用基于代码的答案。你提到状态是在同一个类中设置其他函数,假设这些方法是公开的我提出这样的事情(假设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());
}