【问题标题】:Spring boot - Can't mock MongoTemplateSpring Boot - 无法模拟 MongoTemplate
【发布时间】:2021-03-12 10:03:35
【问题描述】:

我想要测试的服务中有一个方法,它使用 MongoTemplate,如下所示:

@Service
public class MongoUpdateUtilityImpl implements MongoUpdateUtility {
    private final MongoTemplate mongoTemplate;
    
    @Autowired
    MongoUpdateUtilityImpl (final MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    @Override
    public Object update(final String id, final Map<String, Object> fields, final Class<?> classType) {
        ...
        this.mongoTemplate.updateFirst(query, update, classType);
        return this.mongoTemplate.findById(id, classType);
    }       
}

然后我尝试用 mongo 模板的模拟方法测试这个方法:

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
public class MongoUpdateUtilityTest {
    @MockBean
    private MongoTemplate mongoTemplate;

    @Autowired
    private MongoUpdateUtility mongoUpdateUtility;

    /**
     * Test en el que se realiza una actualización correctamente.
     */
    @Test
    public void updateOK1() {
        final Map<String, Object> map = new HashMap<>();

        map.put("test", null);
        map.put("test2", "value");

        when(mongoTemplate.updateFirst(Mockito.any(Query.class), Mockito.any(Update.class), Mockito.any(Class.class)))
                .thenReturn(null);
        when(mongoTemplate.findById(Mockito.anyString(), Mockito.any(Class.class))).thenReturn(null);

        assertNull(this.mongoUpdateUtility.update("2", map, Map.class));
    }
}

我已阅读this 问题,但是当我尝试标记为解决方案的答案时,它说 MongoTemplate 无法初始化。我更喜欢模拟这个而不是使用和嵌入数据库,因为我可以使用的库有限。

我的错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'operacionesPendientesRepository' defined in es.santander.gdopen.operpdtes.repository.OperacionesPendientesRepository defined in @EnableMongoRepositories declared on MongoRepositoriesRegistrar.EnableMongoRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.NullPointerException

【问题讨论】:

    标签: spring mongodb spring-boot mockito springmockito


    【解决方案1】:

    您正在使用 @SpringBootTest 来调出整个应用程序上下文。这意味着您的应用中定义的每个 bean 都将被初始化。

    对于@Service 的测试来说,这是一种矫枉过正:

    • 您的测试将需要更长的时间来执行
    • 整个上下文必须正确

    对于@Service 的测试,我建议您采用更简单的方法并单独测试服务。

    • 使用 Mockito 扩展/运行器(取决于 junit 版本)
    • 摆脱@SpringBootTest、@ActiveProfiles 和 SpringRunner
    • 使用@Mock 而不是@MockBean
    • 使用@InjectMocks 代替@Autowired

    【讨论】:

      猜你喜欢
      • 2021-04-02
      • 1970-01-01
      • 2016-11-12
      • 2017-07-29
      • 1970-01-01
      • 2022-01-25
      • 2019-07-01
      • 2019-07-04
      • 1970-01-01
      相关资源
      最近更新 更多