如何在SpringBoot应用程序中正确使用mock?

8xiog9wr  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(260)

我有一个非私有和非最终的存储库类,我不会测试。我的简单测试如下:`

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 jdbcbc模板。但当我启动应用程序时,它失败了,只有下一个例外:
org.mockito.exceptions.base.mockitoexception:mockito无法模拟此类:class org.springframework.jdbc.core.jdbctemplate。
mockito只能模拟非私有和非final类。如果您不确定为什么会出现此错误,请向邮件列表报告。
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单元试件

sbdsn5lh

sbdsn5lh1#

你需要告诉mockito使用在线mockmaker。
默认情况下,mockito不能模拟final类。它需要一个不同的mockmaker(创建mock的类)。
创建以下目录: src/test/resources/mockito-extensions 使用以下行: mock-maker-inline 这应该会让例外消失。另请参见此baeldung帖子。
但是,我强烈建议使用 @DataJpaTest 用于测试存储库层。另请参见此baeldung帖子。

相关问题