【问题标题】:Mocked method still being executed模拟方法仍在执行
【发布时间】:2018-03-15 06:47:41
【问题描述】:

我正在 Android 代码库中运行此测试。我的目标方法依赖于另一种检查网络连接的方法。由于网络连接检查具有 Android 依赖项,因此我尝试模拟该方法。尽管如此,它仍在执行,我得到了一个使用 Android 上下文方法的 NPE。我已经尝试过 Roboelectric 和 Junit 跑步者。

import android.content.Context;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;


@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
@PrepareForTest({Network.class, Messages.class})
public class MessagesTest {

    @Test
    public void getStatus() throws Exception {
        PowerMockito.mockStatic(Network.class);
        when(Network.isConnected(any(Context.class))).thenReturn(false);
        String s = Messages.getStatus(mock(Context.class));
        assertEquals(s, "offline");
    }

}




public class Messages {

    public static String getStatus(Context context){
        if(Network.isConnected(context)) return "online";
        else return "offline";
    }
}



public class Network {

    private static final String MOBILE = "MOBILE";
    private static final String WIFI = "WIFI";


    public static boolean isConnected(Context context) {
        boolean isWifiConnected = false;
        boolean isMobileConnected = false;

        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] allNetworkInfo = connectivityManager.getAllNetworkInfo();
        for (NetworkInfo networkInfo : allNetworkInfo) {
            if (networkInfo != null && WIFI.equalsIgnoreCase(networkInfo.getTypeName())) {
                isWifiConnected = networkInfo.isConnectedOrConnecting();
            }

            if (networkInfo != null && MOBILE.equalsIgnoreCase(networkInfo.getTypeName())) {
                isMobileConnected = networkInfo.isConnectedOrConnecting();
            }

        }
        return isWifiConnected || isMobileConnected;
    }
}

NPE 被抛出在 Network 类中,其中正在调用 context.getSystemService()

【问题讨论】:

    标签: android mockito powermock


    【解决方案1】:

    看起来我只需要PowerMockRunner 而不是RobolectricTestRunner。如果使用RobolectricTestRunner,那么我们还应该添加以下内容:

    @Rule
    public PowerMockRule powerMockRule = new PowerMockRule();
    
    @Rule
    public MockitoRule mockitoRule = MockitoJUnit.rule();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2017-05-17
      相关资源
      最近更新 更多