Java 如何同时使用real类和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; } 上

我正在尝试使用Mockito运行单元测试,但我有一个助手方法,我想使用一个真正的类:

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类”,是的,这就是答案,既然你提到了,我意识到这实际上是我在问题中添加的链接中描述的,但是没有强调“它正在你的计算机上运行”,我就不明白了。伟大的朋友,我很高兴帮助你。