Java 如何同时使用real类和mockito?
我正在尝试使用Mockito运行单元测试,但我有一个助手方法,我想使用一个真正的类:Java 如何同时使用real类和mockito?,java,android,unit-testing,mockito,Java,Android,Unit Testing,Mockito,我正在尝试使用Mockito运行单元测试,但我有一个助手方法,我想使用一个真正的类: public static Location fromCoordinates(float latitude, float longitude){ Location result = new Location(""); result.setLatitude(latitude); result.setLongitude(longitude); return result; } 上
public static Location fromCoordinates(float latitude, float longitude){
Location result = new Location("");
result.setLatitude(latitude);
result.setLongitude(longitude);
return result;
}
上面的方法当前导致“method…not mocked.”错误如上所述,它给出了如何使用默认值的建议,但这对我不起作用,因为这会导致纬度和经度随后返回0
我还尝试添加Mockito.mock(Location.class,CALLS\u REAL\u方法)代码>在我的测试开始时,似乎没有效果
如何配置我的测试以使用real Location类,同时仍然使用mockito来模拟其他类
[编辑]
在上下文中,这是有问题的单元测试
@Test
public void OpensCenteredInLocation() {
Location l = Mockito.mock(Location.class, CALLS_REAL_METHODS);
//When the user starts the app
LocationManager m = Mockito.mock(LocationManager.class);
Location initial = LocationHelper.fromCoordinates(10, 15); //<--it fails here
doReturn(initial).when(m).getLastKnownLocation(any(String.class));
MyApp main = new MyApp(m);
//Then it should open with the map centered in the user's location
Assert.assertEquals(10, main.CameraPosition.longitude, 0);
Assert.assertEquals(15, main.CameraPosition.longitude, 0);
}
@测试
public void OpensCenteredInLocation(){
Location l=Mockito.mock(Location.class,调用\u REAL\u方法);
//当用户启动应用程序时
LocationManager m=Mockito.mock(LocationManager.class);
Location initial=LocationHelper.fromCoordinates(10,15);//我认为真正的问题不是因为fromCoordinates
方法是静态的,我认为真正的问题是因为Location
是一个内置的Android类
事实上,当你运行一个单元测试时,它是在你的计算机上运行的,而不是在安卓设备上。所以你不能使用内置的安卓类
看一看
然后根据这个告诉您可以添加到build.gradle文件中
android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
这可以防止android类在您尝试使用它们时抛出异常,但请注意,这样做的目的是
更改行为,使方法返回null或零Mockito无法模拟静态方法。你需要类似PowerMockito的东西来实现这一点。但更大的问题是,你想测试什么,在哪里首先需要模拟位置
对象?我不需要模拟位置,这就是问题所在,我需要mockito为了允许我调用真正的构造函数,“Method…not mocked”消息似乎是由新位置(“”
调用fromCoordinates
是一个静态方法,因此您根本不需要构造一个新的位置
对象。只需调用位置.fromCoordinates(…)
在需要的地方。在位置上是否有其他非静态方法需要模拟?@Jordan这正是我的测试所做的,它在新位置(“”)抛出异常
这是我编写的fromCoordinates
方法的一部分,我找不到android.location.location.fromCoordinates
方法,问题中显示的方法是MyApp.LocationHelper.fromCoordinates
(我自己的类)正如@Jordan
所指出的,您可能需要使用PowerMockito
。或者您用自己的对象替换android中的Location
对象。正如链接所描述的,您没有选择使用真实对象进行测试。“您不能使用内置的android类”,是的,这就是答案,既然你提到了,我意识到这实际上是我在问题中添加的链接中描述的,但是没有强调“它正在你的计算机上运行”,我就不明白了。伟大的朋友,我很高兴帮助你。