gemfire cacheclosedexception缓存尚未创建



我正在尝试为一个方法编写单元测试,该方法使用下面的缓存实例

public void method(String abc) {
....
....
Cache cache = CacheFactory.getAnyInstance();
....
....
}

我知道嘲讽是解决这种对缓存依赖的方法。我对mockinto和使用mockinto是个新手,不知道如何将mockind缓存传递给该方法。

@Mock
Cache cache;
@Test
public void testMethod(){
   doReturn(cache).when(CacheFactory.getAnyInstance());
   method("abc");
}

以上是我尝试过的,但出现了错误。

如果您正在测试调用CacheFactory.getAnyInstance()的应用程序组件中的某些代码路径(如method("abc")?),那么您必须确保该方法以另一种方式获得对mock Cache的引用,因为您无法模拟类上的静态方法(如CacheFactory上的getAnyInstance()),至少在没有PowerMock等框架的帮助的情况下是这样。例如

public class ExampleApplicationComponent {
  public void methodUnderTest(String value) {
    ...
    Cache hopefullyAMockCacheWhenTesting = CachFactory.getAnyInstance();
    ...
    // do something with the Cache...
  }
}

当然,这将失败。所以你需要重新构造一下你的代码。。。

public class ExampleApplicationComponent {
  public void methodUnderTest(String value) {
    ...
    Cache cache = fetchCache();
    ...
    // do something with the (mock) Cache...
  }
  Cache fetchCache() {
    return CacheFactory.getAnyInstance();
  }
}

然后在你的测试课上的测试用例中。。。

public class ExampleApplicationComponentTest {
  @Mock
  private Cache mockCache;
  @Test
  public void methodUsesCacheProperly() {
    ExampleApplicationComponent applicationComponent = 
        new ExampleApplicationComponent() {
      Cache fetchCache() {
        return mockCache;
      }
    };
    applicationComponent.method("abc");
    // assert appropriate interactions were performed on mockCache
  }
}

因此,正如您所看到的,您可以在测试用例中重写匿名ExampleApplicationComponent子类中的fetchCache()方法,以返回mock Cache。还要注意的是,fetchCache()方法被故意设置为"包私有",以限制它主要对测试类的可访问性(因为测试类通常并且应该与被测试类位于同一个包中)。这可以防止fetchCache方法转义并成为API的一部分。虽然同一包中的其他类可以访问ExampleApplicationComponent类实例的方法,但您至少可以重新训练对该用法的控制(当然,没有什么可以代替好的文档)。

要在实践中看到这方面的其他示例,请查看Spring Data GemFire的CacheFactoryBBeanTest类(例如,具体地说),它正是我上面使用Mockito描述的。

希望这能有所帮助。

干杯!-John

我能够在PowerMockito的帮助下做到这一点。下面是代码

mockStatic(CacheFactory.class);
when(CacheFactory.getAnyInstance()).thenReturn(cache);
method("abc");
verifyStatic();
CacheFactory.getAnyInstance();

相关内容

  • 没有找到相关文章