当前位置: 首页 > 知识库问答 >
问题:

当你不服从的时候。然后返回

訾高明
2023-03-14

我正在使用PowerMockito验证私有方法的调用数:loadProperties()。我还将该方法存根以返回预定义的值。

尽管我已将方法存根,但实际的实现正在被调用,并抛出一个NullPointerException,因为它的依赖项(“loader”变量,请参见下面的代码片段)没有为此测试定义(也不应该定义)。

作为实验,我把方法改成公开,然后就没问题了!

我认为这是PowerMockito中的一个错误,但我在比这更确定的事情上错了!

这是密码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.HashMap;
import java.util.Map;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;


@RunWith(PowerMockRunner.class)
@PrepareForTest({DArgumentsLoader.class})
public class TestConfig {
 @Test
 public void testGetPropertyMapCalledOnce() throws Exception {
     Config configMock = mock(Config.class);
     Map<String, String> testMap = new HashMap<String, String>();
     testMap.put("xx", "xx");
     when(configMock, "loadProperties").thenReturn(testMap);

     when(configMock.getString(anyString(), anyString())).thenCallRealMethod();
     // call it twice
     configMock.getString("xx", "yy");
     configMock.getString("xx", "yy");
     // verify loadProperties was only called once
     PowerMockito.verifyPrivate(configMock, times(1)).invoke("loadProperties");
 }
}

为了澄清,Config类看起来像这样

private Map<String, String> loadProperties() throws IOException, HttpException {
    return loader.loadProperties();
}

public String getString(String key, final String defaultValue) {
    String value = getPropertyMap().get(key);
    if(value != null) {
        return value;
    } else {
        return defaultValue;
    }
}

private Map<String, String> getPropertyMap() throws LoadException {
    if(propertyMap == null) {
        propertyMap = loadProperties();
    }
    return propertyMap;
}

鉴于测试人员所说的事实,根本不应该调用loadProperties()方法

when(configMock, "loadProperties").thenReturn(testMap);

但它正在被调用,并抛出一个NullPointerException。这是一个bug还是一个特性?

共有1个答案

暴奕
2023-03-14

您没有准备用于mocking的Config类,因此PowerMock无法处理它。只需将其添加到@PREareForTest注释中,就可以了:

@PrepareForTest({Config.class, DArgumentsLoader.class})
 类似资料:
  • 我目前正在学习Spring boot,我一直在测试一个项目——非常感谢任何帮助,因为我是这里的初学者。 我有一个rest控制器测试,使用Mockito,当使用Mockito.when()调用方法时,该测试似乎忽略了Then返回。 这是整个班级: 名为“testCreateUser”的测试没有问题地通过了。给我一个问题的是名为“testFindUserById”的测试。 以下是我尝试测试的控制器方法

  • 问题内容: 我正在尝试使用“ any”匹配器对这个getKeyFromStream方法进行存根。我尝试了更明确和不太明确的(anyObject()),但似乎无论我如何尝试,此存根都不会在我的单元测试中返回fooKey。 我想知道是否是因为它受到保护,或者我缺少其他东西或做错了什么。在整个测试中,我还有其他的when / then语句在 起作用, 但是由于某种原因,事实并非如此。 注意:getKey

  • 测试类别 测试类别 详图搁置器 当我尝试模拟方法HistoryFromStrgyTable()的数据时,它实际上是在调用HistoryFromStrgyTable(),而不是从mockHistoryFromStrgyTable()获取数据。 我的测试用例在这一行失败了 谁能帮我一下吗。我不明白怎么了。我还将方法mockHistoryFromStrgyTable()从private更改为public

  • 当一个方法完成时,我试图使用Byte Buddy来执行一些额外的逻辑。以下是示例代码: 当我把代表团和。第二次调用时,此实例的原始调用方将丢失来自“proxyClient”对象的返回值,该对象以前用于调用它的方法调用。我是不是用错了? 基本上,我希望在方法的末尾添加一些附加逻辑(在原始方法内部或添加另一个方法调用并不重要),但同时保留原始方法调用的返回值。

  • 问题内容: 使用标准Java库,从IPV4地址的虚线字符串表示形式()到等效整数表示形式()的最快方法是什么。 相应地,反转所述操作的最快方法是什么-从整数到字符串表示形式? 问题答案: 字符串到整数: 整数到字符串:

  • 问题内容: 我以为我有一种快速的方法来将“唯一标识符”值转换成Big Int,然后再转换回来。但是在我的第二次转换中有一个问题。任何人都可以评论将GUID完全转换为数字并返回的正确方法吗?当我尝试将其从数字表示形式转换回其原始GUID时,我只是得到了GUID的一部分,而不是全部。 我想将一个整数(我认为它将在MSSQL中归类为“ Large BigInt”?)传递给远程系统,仅使用字符0-9,并且