【问题标题】:How can I correctly use Mock in Spring Boot app?如何在 Spring Boot 应用程序中正确使用 Mock?
【发布时间】:2021-05-30 21:58:31
【问题描述】:

我有一个非私有且非最终的存储库类,我将对其进行测试。我的简单测试如下:`

import com.trainig.spring.main.project.entity.User;
import com.trainig.spring.main.project.mapper.ForUnitTestUserRowMapper;
import com.trainig.spring.main.project.repository.user.UserRepository;
import com.trainig.spring.main.project.repository.user.UserRepositoryImpl;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.util.ReflectionTestUtils;

import static com.trainig.spring.main.project.repository.user.UserRepositoryImpl.FIND_BY_NAME;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class UserRepositoryImplTest {

@Mock
JdbcTemplate jdbcTemplate;

@Before
public void initMocks(){
    MockitoAnnotations.initMocks(this);
}

@Test
public void findByNameTest() {
    String userName = "Name";
    User user = new User();
    user.setUserName(userName);
    UserRepository userRepository = new UserRepositoryImpl();
    ReflectionTestUtils.setField(userRepository, "jdbcTemplate", jdbcTemplate);
    Mockito.when(jdbcTemplate.queryForObject(
            FIND_BY_NAME,
            new ForUnitTestUserRowMapper(),
            userName))
            .thenReturn(user);
    assertEquals(user, userRepository.findByName(userName));
}

}

我在其中模拟了一个自动装配的 bean jdbcTemplate。 但是当我启动应用程序时,它会失败并出现下一个异常:

org.mockito.exceptions.base.MockitoException: Mockito 无法模拟此类:class org.springframework.jdbc.core.JdbcTemplate。

Mockito 只能模拟非私有和非最终类。如果你不是 确定您收到此错误的原因,请向邮件列表报告。

Java:11 JVM 供应商名称:Oracle Corporation JVM 供应商版本:11.0.9+7-LTS JVM 名称:Java HotSpot(TM) 64 位服务器 VM JVM 版本:11.0.9+7-LTS JVM 信息
:混合模式操作系统名称:Windows 10 操作系统版本:10.0

基础异常:java.lang.UnsupportedOperationException: 不能 使用反射定义类

在 com.training.spring.main.project.repository.user.UserRepositoryImplTest.initMocks(UserRepositoryImplTest.java:26)

我做错了什么?我所做的一切都像文章中所写的那样。 Spring unit test article

【问题讨论】:

  • JdbcTemplate 类中没有任何东西可以阻止 Mockito 模拟它(不需要mock-maker-inline 或其他技巧)。确保所有与 mockito 相关的依赖项都具有相同的版本。如果您使用的是 Maven,请运行 mvn dependency:tree

标签: java spring spring-boot unit-testing mocking


【解决方案1】:

您需要告诉 Mockito 使用内联 mockmaker。

Mockito 默认不能模拟最终类。为此,它需要一个不同的 mockmaker(创建 mock 的类)。

创建以下目录: src/test/resources/mockito-extensions 使用以下行: mock-maker-inline

这应该会使异常消失。另见thisBaeldung 帖子。

但是,我强烈建议使用@DataJpaTest 来测试存储库层。另见thisBaeldung 帖子。

【讨论】:

  • 现在我得到了另一个错误:基础异常:org.mockito.exceptions.base.MockitoException:无法修改所有类
  • 嗯,太糟糕了。 :/ 我不认为嘲笑JdbcTemplate 类是要走的路。如果可能,我建议使用@DataJpaTest 路由,该路由将针对内存数据库执行。这样您就可以测试模板中的查询是否有效,而不是尝试将它们存根。
猜你喜欢
  • 2018-12-30
  • 2020-03-30
  • 1970-01-01
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多