Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Powermock不断返回一个空对象而不是模拟对象_Android_Mocking_Robolectric_Powermock_Powermockito - Fatal编程技术网

Android Powermock不断返回一个空对象而不是模拟对象

Android Powermock不断返回一个空对象而不是模拟对象,android,mocking,robolectric,powermock,powermockito,Android,Mocking,Robolectric,Powermock,Powermockito,因此,我在测试中查看模拟对象。 但是,当执行代码的“Mockito.when(mock.getName()”部分时,以下测试将返回npe,这是因为mock对象返回为null package com.example.activity; import com.example.BuildConfig; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.M

因此,我在测试中查看模拟对象。 但是,当执行代码的“Mockito.when(mock.getName()”部分时,以下测试将返回npe,这是因为mock对象返回为null

package com.example.activity;

import com.example.BuildConfig;

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;

import static org.junit.Assert.assertTrue;

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(Static.class)
public class DeckardActivityTest {

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    @Mock
    public ToBeMocked mock;

    @Test
    public void testSomething() throws Exception {
        assertTrue(Robolectric.buildActivity(DeckardActivity.class).create().get() != null);
    }

    @Test
    public void testStaticMocking() {
        PowerMockito.mockStatic(Static.class);
        Mockito.when(Static.staticMethod()).thenReturn(mock);
        Mockito.when(mock.getName()).thenReturn("Mock");
        assertTrue(Static.getResp().equals("Mock"));
    }
}
以及我们正在测试的简单类

包com.example.activity

public class Static {

    private static ToBeMocked toBeMocked;

    public static ToBeMocked staticMethod() {
        toBeMocked = new ToBeMocked();
       return toBeMocked;
    }

    public static String getResp(){
        return toBeMocked.getName();
    }
}
所以我的理解肯定是错的。 我想做的是模拟ToBeMocked类依赖项,并告诉模拟对象在对其调用getName方法时如何响应


有人能帮我解释一下为什么会出错,或者指出我一定误解了什么吗?

是的,你理解错了。我的意思是你误解了模拟的工作原理

您的方法
getResp
(在示例中)使用了根本不会设置的内部状态,因为在调用
PowerMockito.mockStatic(Static.class);
Static.class的所有静态方法调用都将被拦截。因此代码:

toBeMocked = new ToBeMocked();
return toBeMocked;
从来没有人打过电话

如果
getResp
使用了
staticMethod()
,那么代码就可以工作了

public static String getResp(){
    return staticMethod().getName();
}
因此,您有两种选择来解决您的问题:

  • 正如我指出的那样重构代码
  • 用于模拟
    toBeMocked=new toBeMocked();

    • 是的,你理解错了。我的意思是你误解了模拟的工作原理

      您的方法
      getResp
      (在示例中)使用了根本不会设置的内部状态,因为在调用
      PowerMockito.mockStatic(Static.class);
      Static.class的所有静态方法调用都将被拦截。因此代码:

      toBeMocked = new ToBeMocked();
      return toBeMocked;
      
      从来没有人打过电话

      如果
      getResp
      使用了
      staticMethod()
      ,那么代码就可以工作了

      public static String getResp(){
          return staticMethod().getName();
      }
      
      因此,您有两种选择来解决您的问题:

      • 正如我指出的那样重构代码
      • 用于模拟
        toBeMocked=new toBeMocked();

      为我做点什么,将Mockito.when(mock.getName()).thenReturn(“mock”)移动到静态方法的thenReturn上方。为我做点什么,将Mockito.when(mock.getName()).thenReturn(“mock”)移动到静态方法的thenReturn上方。