Spring boot - 无法模拟 MongoTemplate

Wro*_*ong 4 spring mockito mongodb springmockito spring-boot

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

\n
@Service\npublic class MongoUpdateUtilityImpl implements MongoUpdateUtility {\n    private final MongoTemplate mongoTemplate;\n    \n    @Autowired\n    MongoUpdateUtilityImpl (final MongoTemplate mongoTemplate) {\n        this.mongoTemplate = mongoTemplate;\n    }\n\n    @Override\n    public Object update(final String id, final Map<String, Object> fields, final Class<?> classType) {\n        ...\n        this.mongoTemplate.updateFirst(query, update, classType);\n        return this.mongoTemplate.findById(id, classType);\n    }       \n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后我尝试使用 mongo 模板的模拟方法来测试此方法:

\n
@SpringBootTest\n@RunWith(SpringJUnit4ClassRunner.class)\n@ActiveProfiles("test")\npublic class MongoUpdateUtilityTest {\n    @MockBean\n    private MongoTemplate mongoTemplate;\n\n    @Autowired\n    private MongoUpdateUtility mongoUpdateUtility;\n\n    /**\n     * Test en el que se realiza una actualizaci\xc3\xb3n correctamente.\n     */\n    @Test\n    public void updateOK1() {\n        final Map<String, Object> map = new HashMap<>();\n\n        map.put("test", null);\n        map.put("test2", "value");\n\n        when(mongoTemplate.updateFirst(Mockito.any(Query.class), Mockito.any(Update.class), Mockito.any(Class.class)))\n                .thenReturn(null);\n        when(mongoTemplate.findById(Mockito.anyString(), Mockito.any(Class.class))).thenReturn(null);\n\n        assertNull(this.mongoUpdateUtility.update("2", map, Map.class));\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

我的错误:

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

Les*_*iak 7

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

对于 @Service 的测试来说,这是一种过度的杀伤力:

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

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

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