我试图为具有wifi状态条件的函数编写单元测试。当wifi状态断开时,该函数返回false,但我想模拟连接wifi状态时的场景。我该怎么办呢?我应该为状态变量设置一个setter吗?这不是一个坏方法吗?
我想测试的功能:
public boolean performSomething() {
if (WIFI_STATE != "connected") {
return false;
}else{
....
}
}
我想测试上面函数的else部分,但是你可能已经猜到了,该函数执行if条件,并返回false,因为WIFI_STATE是"断开"
答案 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)
假设您正在谈论“本地单元测试”而不是“仪器化单元测试”,您可以使用Robolectric:http://robolectric.org
http://robolectric.org/javadoc/3.0/org/robolectric/shadows/ShadowWifiManager.html
本地单位测试: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
仪表单元测试: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html
答案 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());
}