【问题标题】:Powermock keeps returning me a null object not a mockPowermock 不断返回我一个空对象而不是一个模拟
【发布时间】:2016-04-07 12:44:56
【问题描述】:

所以我正在查看测试中的模拟对象。 但是,当执行“Mockito.when(mock.getName()”部分代码时,以下测试将返回 npe,那是因为模拟对象返回为 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 方法时如何响应。

有人可以帮助我了解为什么会出错或指出我一定误解了什么

【问题讨论】:

  • 为我试一试,移动 Mockito.when(mock.getName()).thenReturn("Mock");静态方法的 thenReturn 上方。

标签: android mocking robolectric powermock powermockito


【解决方案1】:

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

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

toBeMocked = new ToBeMocked();
return toBeMocked;

永远不会被调用。

如果getResp 使用staticMethod(),那么您的代码将起作用。

public static String getResp(){
    return staticMethod().getName();
}

所以您有两种选择来解决您的问题:

  • 按照我的指示重构您的代码
  • 使用mock constructor模拟toBeMocked = new ToBeMocked();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2011-12-26
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多