@Test
  public void getAllShouldNotThrowExceptionWhenEntryIsLocallyDeletedBetweenFetches() {
    client.invoke(() -> {
      final String testKey = KEYS.get(0);
      assertThat(ClusterStartupRule.getClientCache()).isNotNull();
      LocalRegion clientRegion = spy((LocalRegion) ClusterStartupRule.getClientCache()
          .getRegion(testName.getMethodName()));

      doAnswer(invocation -> {
        // Retrieve the original entry.
        Object entry = invocation.callRealMethod();
        // Destroy the entry locally to simulate an expiration/eviction.
        clientRegion.localDestroy(testKey);
        // Return the original entry.
        return entry;
      }).when(clientRegion).accessEntry(KEYS.get(0), true);

      @SuppressWarnings("unchecked")
      Map<String, String> getAllResult = (Map<String, String>) clientRegion.getAll(KEYS);
      // Locally destroyed entries should be retrieved from the server.
      IntStream.range(0, KEYS.size())
          .forEach(i -> assertThat(getAllResult.get(KEYS.get(i))).isEqualTo(VALUES.get(i)));
    });
  }
See GEODE-7535.
This test executes a getAll operation from the client and, between the internal retrievals of
the actual entry within the {@link LocalRegion#basicGetAll(Collection, Object)} method, locally
destroy the entry to simulate an eviction/expiration action.
The region should try to get the entry from the server instead of failing with
{@link EntryDestroyedException}.
geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientCachingProxyRegionDistributedTest.java