【问题标题】:How can I use a HashMap to mock out my Mongo DB repository如何使用 HashMap 模拟我的 Mongodb 存储库
【发布时间】:2018-04-02 18:03:25
【问题描述】:

我正在尝试找出一种方法来创建我的 Mongo DB 存储库的模拟实现,该存储库在幕后使用了 HashMap。这样,我就不必模拟每一个数据库调用,而可以简单地让数据库充当黑匣子,并在最后检查结果。

【问题讨论】:

    标签: java spring mongodb unit-testing black-box-testing


    【解决方案1】:

    我发现这篇文章对我很有帮助:http://www.heavyweightsoftware.com/blog/creating-a-mock-class-for-unit-testing-with-a-spring-repository/

    简而言之,这是该页面的实现:

    public class MockWidgetRepository implements WidgetRepository{
        Map<Long, Widget>                   backingMap = new HashMap<>();
    
        @Override
        public <S extends Widget> S save(S entity) {
            backingMap.put(entity.getId(), entity);
    
            return entity;
        }
    
        @Override
        public <S extends Widget> List<S> save(Iterable<S> entites) {
            return null;
        }
    
        @Override
        public Widget findOne(Long id) {
            Widget result = backingMap.get(id);
            return result;
        }
    
        @Override
        public boolean exists(Long aLong) {
            return false;
        }
    
        @Override
        public List<Widget> findAll() {
            List<Widget> result = new ArrayList<>();
    
            result.addAll(backingMap.values());
    
            return result;
        }
    
        @Override
        public Iterable<Widget> findAll(Iterable<Long> longs) {
            return null;
        }
    
        @Override
        public long count() {
            return 0;
        }
    
        @Override
        public void delete(Long aLong) {
    
        }
    
        @Override
        public void delete(Widget entity) {
    
        }
    
        @Override
        public void delete(Iterable<? extends Widget> entities) {
    
        }
    
        @Override
        public void deleteAll() {
            backingMap.clear();
        }
    
        @Override
        public List<Widget> findAll(Sort sort) {
            return null;
        }
    
        @Override
        public Page<Widget> findAll(Pageable pageable) {
            return null;
        }
    
        @Override
        public <S extends Widget> S insert(S entity) {
            return null;
        }
    
        @Override
        public <S extends Widget> List<S> insert(Iterable<S> entities) {
            return null;
        }
    
        @Override
        public <S extends Widget> S findOne(Example<S> example) {
            return null;
        }
    
        @Override
        public <S extends Widget> List<S> findAll(Example<S> example) {
            return null;
        }
    
        @Override
        public <S extends Widget> List<S> findAll(Example<S> example, Sort sort) {
            return null;
        }
    
        @Override
        public <S extends Widget> Page<S> findAll(Example<S> example, Pageable pageable) {
            return null;
        }
    
        @Override
        public <S extends Widget> long count(Example<S> example) {
            return 0;
        }
    
        @Override
        public <S extends Widget> boolean exists(Example<S> example) {
            return false;
        }
    }
    

    【讨论】:

    • 为了安全起见,我会在 save 方法中创建实体的副本,只是为了确保客户端不会忽略返回值(假设它是相同的对象作为传入的对象)。您还可以使用计数器为新实体等提供 ID,具体取决于测试的彻底程度
    【解决方案2】:

    您可以使用 Fongo (https://github.com/fakemongo/fongo) 或 https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo。后者被spring框架用作嵌入式内存Mongodb。

    【讨论】:

      猜你喜欢
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多