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

JMockit--在模拟System.getProperties()时“缺少对模拟类型的调用”

颜杰
2023-03-14

诚然,我对JMockit是新手,但出于某种原因,我在模仿System.getProperties()时遇到了麻烦。感谢以下帖子的帮助:

https://stackoverflow.com/questions/25664270/how-can-i-partially-mock-the-system-class-with-jmockit-1-8?lq=1

我可以使用JMockit 1.12成功地模拟System.getProperty():

@Test
public void testAddSystemProperty_String() {
    final String propertyName = "foo";
    final String propertyValue = "bar";

    new Expectations(System.class) {{
        System.getProperty(propertyName);
        returns(propertyValue);
    }};

    assertEquals(propertyValue, System.getProperty(propertyName));
}

但是模仿getProperties()barfs的代码非常相似:

@Test
public void testAddSystemProperty_String() {
    final String propertyName = "foo";
    final String propertyValue = "bar";

    final Properties properties = new Properties();
    properties.setProperty(propertyName, propertyValue);

    new Expectations(System.class) {{
        System.getProperties();
        returns(properties);
    }};

    assertEquals(1, System.getProperties().size());
}
Missing invocation to mocked type at this point; 
please make sure such invocations appear only after 
the declaration of a suitable mock field or parameter

Exceptions块上的JMockit NullPointerException?

我还发现2-3年前使用JMockit的许多解决方案现在完全不可编译,所以显然情况发生了很大变化。

共有1个答案

关志勇
2023-03-14

system.getproperties()确实是JMockit 1.12中被排除在mocking之外的方法之一。当发现新的有问题的JRE方法时,这些排除的方法的确切集合可能会在新的版本中发生变化。

不过,不需要模拟system.getproperty(...)system.getproperties()system类提供了setpropertysetproperties方法,可用于替代。

 类似资料:
  • 上面还有第二个问题。当我在Expects块中定义mock类时(如上),似乎只调用了构造函数,而不是,因此没有正确初始化对象。我通过将它移到方法中并在那里实例化该类来解决这个问题。看起来是这样的: 因此,这似乎得到了要调用的正确构造函数,但似乎还在调用。有什么见解吗?

  • 关于@mocked声明为junit测试的实例变量,如@mocked ClassB ClassB: (1)对于junit,实例变量是为每个测试新创建的(比如test1()、test2()),对吗?在每个测试运行之前,是否会创建一个新的模仿的ClassB实例? (2)它嘲笑班级。它使ClassB中的所有方法对所有测试(在本例中是test1()和test2())都是模拟的,对吗?

  • 当我启动模拟器时,我收到错误消息,因为 模拟器:PANIC:缺少“arm”CPU的模拟器引擎程序。 模拟器:进程已完成,退出代码为 1 Win 10 , Android Studio3.1.4 , AVD 联结 4 Api21

  • 有什么想法吗?我已经找了一段时间但没有答案。请帮忙

  • 我试图模拟一个单例类(SessionDataManager),通过调用静态getInstance()方法获得一个实例,但所有尝试似乎都返回null。 我试过了