我正在尝试为一个方法编写单元测试,该方法使用下面的缓存实例
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();