如何在测试中模拟closeableiterator?

jtoj6r0c  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(328)

在我的实现中,我通过返回的elasticsearchtemplate#stream()从elasticsearch获取数据 CloseableIterator<> .
我想通过以下方式来模拟这种方法:

List<MyClass> foo = new ArrayList<>(); // and then I add some elements
when(mockTemplate.stream(any(SearchQuery.class), eq(MyClass.class))
 .thenReturn(foo.iterator());

但是 iterator() 退货 Iterator<MyClass> 哪一个不是 CloseableIterator<MyClass> 我不知道该怎么投,也不知道该怎么解决。

ldioqlga

ldioqlga1#

org.springframework.data.util.CloseableIterator.CloseableIterator 从Spring到Spring java.util.Iterator jdk提供了足够接近的接口:的确如此 CloseableIteratorIterator 作为父接口。
也就是说你可以用 Iterator 通过 CloseableIterator 但不是相反:你需要什么。
当你不能返回 Iterator 在模拟记录中,您仍然可以转换 IteratorCloseableIterator . 这不是很难感谢方法委托,但它仍然需要少量的样板。
例子:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.data.util.CloseableIterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;

@ExtendWith(MockitoExtension.class)
public class MockCloseableIteratorTest {

  @Mock
  ElasticsearchTemplate mockTemplateMock;

  @Test
  void foo() {
    List<String> foo = new ArrayList<>();
    // and then I add some elements
    Mockito.when(mockTemplateMock.stream(any(SearchQuery.class), eq(String.class)))
           .thenReturn(createCloseableIterator(foo.iterator()));

  }

  private <T> CloseableIterator<T> createCloseableIterator(Iterator<T> iterator) {
    return new CloseableIterator<T>() {
      @Override public void close() {
      }

      @Override public boolean hasNext() {
        return iterator.hasNext();
      }

      @Override public T next() {
        return iterator.next();
      }
    };
  }
}

相关问题