繁体   English   中英

Mockito 或嵌入式 Mongo 用于单元测试 spring mongorepository

[英]Mockito or Embedded Mongo for unit testing spring mongorepository

嗨,我是 Spring Mongo 测试的新手。 我知道使用像 flapdoodle、fongo、mongo-java-server 这样的嵌入式数据库,我们可以对 mongorepository 进行单元测试。 但是使用 mockito 是否也可以做到这一点? 如果是,那么哪个更好

Mockito用于对外部依赖项的 mocking 调用。 flapdoodle这样的实用程序用于模拟外部依赖项(在本例中为 MongoDB)。 这只是两种不同的方法。

  1. 您可以模拟存储库类的方法以返回一些存根值,而不是调用数据库。 对于这种情况,请参阅下面的示例:
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import static org.mockito.Mockito.doReturn;

class FooRepositoryTest {

    @Mock
    private FooRepository repository;
    
    @Test
    void testGetById() {
        doReturn(new Object()).when(repository).findById("id");
        Object object = repository.getById("id");
    }
}
  1. 您可以模拟您的数据库(仅通过实例化其他一些测试嵌入式数据库)并在测试中对其进行实际调用。 这是flapdoodle派上用场的地方。 在这种情况下,您将使用实际的存储库/服务/等。 请看下面我的例子:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@DataMongoTest
@ExtendWith(SpringExtension.class)
class FooMongoRepositoryTest {
    
    @Autowired
    private FooRepository repository;
    
    @Test
    void testGetById() {
        Object object = repository.getById("id");
    }
}

但是第二种情况不会是真正的单元测试,因为它将使用外部依赖项。 同时,它也不是真正的集成测试,因为您的真实应用程序使用的是真正的 Mongo 数据库,而不是一些flapdoodle依赖项。

回答你关于什么更好的问题。 这取决于具体情况。 使用这些选项中的任何一个都是完全可以接受的。 使用两者甚至是有意义的,因为它只是两种不同类型的开发人员测试。

您还可以考虑什么:

有一个名为testcontainers的不错的库,它允许您在 Docker 容器中运行真实的数据库和其他服务。 它甚至有一个单独的预配置MongoDB 模块

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM