诚然,我对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的许多解决方案现在完全不可编译,所以显然情况发生了很大变化。
system.getproperties()
确实是JMockit 1.12中被排除在mocking之外的方法之一。当发现新的有问题的JRE方法时,这些排除的方法的确切集合可能会在新的版本中发生变化。
不过,不需要模拟system.getproperty(...)
或system.getproperties()
。system
类提供了setproperty
和setproperties
方法,可用于替代。
上面还有第二个问题。当我在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。 我试过了