java - 如何模拟 Google Guava 缓存生成器?

标签 java unit-testing mocking mockito google-guava-cache

    @Component
    public class LibraryService {

        @Autowired
        private BookService bookService;

        private Cache<UUID, Book> bookCache = CacheBuilder.newBuilder().maximumSize(512).expireAfterWrite(15, TimeUnit.MINUTES).build();

        public void someMethod(UUID bookId) {
          try {
            Book book = bookCache.get(bookId, () -> bookService.findBookByUuid(bookId));
            //some operations
          } catch (ExecutionException e) {
            throw new ProcessingFailureException("Failed to load cache value", e);
          }

         }

    }

我需要为此类编写单元测试,以便我尝试如下模拟 Google Guava 缓存。

public class LibraryServiceTest {

    @InjectMocks
    private LibraryService service;

    @Mock
    private BookService bookService;

    @Mock
    private Cache<UUID, Book> bookCache;

    @Before
    public void initialize() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testMethod() throws ExecutionException {
        UUID bookId = UUID.randomUUID();
        Book book = new Book();

        when(bookCache.get(bookId, () -> bookService.findBookByUuid(bookId))).thenReturn(book);

        service.someMethod(bookId);
    }
}

我遇到了一些 NullPointer 异常。

com.google.common.util.concurrent.UncheckedExecutionException: java.lang.NullPointerException
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
    at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4739)
Caused by: java.lang.NullPointerException

注意:我知道,我可以以某种可测试的方式更改方法。在这种情况下,我不能那样做。

有没有办法模拟这本书的缓存?

最佳答案

如果您更好地模拟 get 方法调用,您的代码应该可以工作,以确保参数匹配,这样您将获得预期的书籍实例作为结果。

import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
...

public class LibraryServiceTest {
    ...

    @Test
    public void testMethod() throws ExecutionException {
        ...
        when(bookCache.get(eq(bookId), any(Callable.class))).thenReturn(book);
        ...
    }
}

关于java - 如何模拟 Google Guava 缓存生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41568640/

相关文章:

java - .jsp 文件中的 ModelAttribute : Can not resolve symbol. Spring

java - 如何使用hadoop安装执行mahout

java - Mockito + PowerMock - 模拟 Thread.currentThread().getStackTrace()

c# - 模拟 SignInManager

javascript - 如何在没有 eval 的情况下编写这段 JavaScript 代码(QUnit 模拟)?

java - PrepareForTest 导致 class.getPackage() 返回 null,解决方法吗?

java - Maven:运行程序的生命周期阶段?

java - 抛出 NullPointerException 的最短代码?

c# - 在 Visual Studio 中测试/运行具有受限 CPU/RAM 的 C# 应用程序?

c++ - 模拟整个图书馆