模拟Google GeoAPI DistanceMatrix失败,并出现NullPointerException:Mokito 3.6.0,Powermock 2.0.9,JUnit5,SpringBoot 2.3.5失败

问题描述

依赖关系设置

dependencies {
    // Testing Frameworks
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage',module: 'junit-vintage-engine'
    }

    // Mockito
    testImplementation('org.mockito:mockito-core:3.6.0')
    testImplementation('org.mockito:mockito-junit-jupiter:3.6.0')
    testImplementation('org.powermock:powermock-api-mockito2:2.0.9')

}

test {
  useJUnitPlatform()
  ignoreFailures = false
  maxParallelForks = 1
  testLogging {
     showStandardStreams = true
     events("skipped","Failed")
  }
}

要接受模拟

  • 用于距离矩阵的Google Geo API(外部API调用
...
...  
  /**
   * The API is very expensive to be built
   */
  private GeoApiContext geoApi;

    // Inside of a Google Guave Cache load method...

          // The calculation from Google
    distanceMatrix calculationResult;
      distanceMatrixApiRequest req = distanceMatrixApi.newRequest(geoApi);

      calculationResult = req.origins(addresses.getoriginAddress())
            .destinations(addresses.getDestinationAddress())
            .mode(TravelMode.DRIVING)
            .avoid(RouteRestriction.TOLLS)
            .language(properties.getLanguage())
            .await();

带有Mokito和Powermock的测试类

package ...service.distancematrix;

import static org.junit.jupiter.api.Assertions.assertSame;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.displayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.powermock.api.mockito.powermockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBoottest;
import com.google.maps.DirectionsApi.RouteRestriction;
import com.google.maps.distanceMatrixApi;
import com.google.maps.distanceMatrixApiRequest;
import com.google.maps.GeoApiContext;
import com.google.maps.GeocodingApi;
import com.google.maps.model.distance;
import com.google.maps.model.distanceMatrix;
import com.google.maps.model.distanceMatrixElement;
import com.google.maps.model.distanceMatrixRow;
import com.google.maps.model.Duration;
import com.google.maps.model.TravelMode;
import ....distancematrix.model.distanceMatrixAddresses;
import ....service.distancematrix.model.distanceMatrixResult;

//@RunWith(powermockrunner.class)
//@PrepareForTest({GeocodingApi.class,GeocodingApiRequest.class})
// https://stackoverflow.com/questions/63834940/springboot-cant-resolve-runwith-cannot-find-symbol/63835256#63835256
// https://www.baeldung.com/mockito-junit-5-extension
@ExtendWith(MockitoExtension.class)
@PrepareForTest({GeocodingApi.class,distanceMatrixApiRequest.class})
@SpringBoottest(properties = {"service.distancematrix.googleMapsApiToken=fake-token"})
@displayName("distance Matrix Service Tests")
public class distanceMatrixServiceTests {

  private static final String ORIGIN = "Maceio,Alagoas,Brazil";
  private static final String DESTINATION = "Recife,Pernambuco,Brazil";

  @Autowired
  private distanceMatrixProperties properties;

  @Mock
  private GeoApiContext geoApiContext;


  @InjectMocks
  private distanceMatrixService service;

  @Test
  public void testGetdistanceMatrixForAddresses() throws Exception {
    distanceMatrixAddresses addresses = new distanceMatrixAddresses();
    addresses.setDestinationAddress(DESTINATION);
    addresses.setoriginAddress(ORIGIN);

    distanceMatrixElement element = new distanceMatrixElement();
    element.distance = new distance();
    element.distance.inMeters = 300L;
    element.duration = new Duration();
    element.duration.inSeconds = 44L;

    distanceMatrixRow row = new distanceMatrixRow();
    row.elements = new distanceMatrixElement[] {element};

    distanceMatrix distanceMatrixResult = new distanceMatrix(
        new String[] {ORIGIN},new String[]{DESTINATION},new distanceMatrixRow[]{row});

    distanceMatrixApiRequest distanceMatrixRequest = powermockito.mock(distanceMatrixApiRequest.class);
    when(distanceMatrixRequest.origins(ORIGIN)).thenReturn(distanceMatrixRequest);
    when(distanceMatrixRequest.destinations(DESTINATION)).thenReturn(distanceMatrixRequest);
    when(distanceMatrixRequest.mode(TravelMode.DRIVING)).thenReturn(distanceMatrixRequest);
    when(distanceMatrixRequest.avoid(RouteRestriction.TOLLS)).thenReturn(distanceMatrixRequest);
    when(distanceMatrixRequest.language(properties.getLanguage())).thenReturn(distanceMatrixRequest);

    // NULL POINTER EXCEPTION IS RIGHT IN THE await()'s internal method on base class
    when(distanceMatrixRequest.await()).thenReturn(distanceMatrixResult);

    mockStatic(GeocodingApi.class);

    when(distanceMatrixApi.newRequest(eq(geoApiContext))).thenReturn(distanceMatrixRequest);

    distanceMatrixResult calculatedResult = service.getDrivedistance(addresses);

    assertSame(distanceMatrixResult,calculatedResult);
  }

}

具有故障详细信息的Stacktrace

  • 测试失败,并显示NullPointerException ...
  • distancematrix.distanceMatrixServiceTests.testGetdistanceMatrixForAddresses(distanceMatrixServiceTests.java:87)恰好是await()方法调用...但是它已被when嘲笑 when(distanceMatrixRequest.await()).thenReturn(distanceMatrixResult);
java.lang.NullPointerException
    at com.google.maps.PendingResultBase.makeRequest(PendingResultBase.java:80)
    at com.google.maps.PendingResultBase.await(PendingResultBase.java:57)
    at ...distancematrix.distanceMatrixServiceTests.testGetdistanceMatrixForAddresses(distanceMatrixServiceTests.java:87)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassprocessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassprocessor.java:99)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassprocessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassprocessor.java:79)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassprocessor.stop(JUnitPlatformTestClassprocessor.java:75)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassprocessor.stop(SuiteTestClassprocessor.java:61)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.gradle.internal.dispatch.Reflectiondispatch.dispatch(Reflectiondispatch.java:36)
    at org.gradle.internal.dispatch.Reflectiondispatch.dispatch(Reflectiondispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderdispatch.dispatch(ContextClassLoaderdispatch.java:33)
    at org.gradle.internal.dispatch.ProxydispatchAdapter$dispatchingInvocationHandler.invoke(ProxydispatchAdapter.java:94)
    at com.sun.proxy.$Proxy2.stop(UnkNown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.gradle.internal.dispatch.Reflectiondispatch.dispatch(Reflectiondispatch.java:36)
    at org.gradle.internal.dispatch.Reflectiondispatch.dispatch(Reflectiondispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedobjectConnection$dispatchWrapper.dispatch(MessageHubBackedobjectConnection.java:182)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedobjectConnection$dispatchWrapper.dispatch(MessageHubBackedobjectConnection.java:164)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.base/java.lang.Thread.run(Thread.java:832)

问题

  • ExtendsWith是否正确?为什么模拟为null?
  • 我还要使用其他东西吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)