我正在尝试为具有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());
}