当前位置: 首页 > 知识库问答 >
问题:

如何在spring boot APP中正确使用Mock?

路裕
2023-03-14

我有一个非私有的、非最终的存储库类,我会对它进行测试。我的简单测试看起来像:`

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信息
:混合模式OS名称:Windows 10 OS版本:10.0

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

在com.training.spring.main.project.repository.user.userrepositoryimpltest.initmocks(userrepositoryimpltest.java:26)

我做错了什么?我就像文章里写的一样。spring单元测试文章

共有1个答案

贾骏
2023-03-14

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

默认情况下,模仿者不能模仿最终的类。它需要一个不同的mockmaker(创建mocks的类)。

创建以下目录:src/test/resources/mockito-extensions,其中包含以下行:mock-maker-inline

这应该会使例外消失。另见这篇Baeldung的文章。

但是,我强烈建议使用@datajpatest测试存储库层。另见这篇Baeldung的文章。

 类似资料:
  • 问题内容: 从官方教程中: 在卸载和销毁组件之前立即调用。使用此方法执行任何必要的清除,例如使计时器无效,取消网络请求或清除在其中创建的所有DOM元素。 我了解“使计时器无效”。可以用终止。但是我不理解“清理在中创建的任何DOM元素”,我可以看到这种情况的示例吗? 问题答案: 如果网络请求发送库支持中止正在进行的网络请求调用,则绝对可以在方法中调用该请求。 但是,与清理元素有关。根据目前的经验,我

  • 问题内容: 我一直在尝试在Node.js中调用D3。我首先尝试使用脚本标签从D3的网站导入d3.v2.js D3的作者建议一个人应该“ npm install d3” …我做到了,我可以在节点控制台中成功调用它: 但是,当尝试使用“ node app.js”从app.js调用它时,我得到: 我意识到,D3的作者在其他地方已经明确规定了应该使用画布: https://github.com/mbost

  • 问题内容: 我读了这篇文章《如何真正地,真正地使用QThreads》。完整说明,它说而不是子类qthread和重新实现run(),应使用moveToThread(QThread *)使用moveToThread将QObject推送到QThread实例上 这是C ++示例,但我不知道如何将其转换为python代码。 我一直在使用这种方法来生成qthread,但是如您所见,它使用的是不推荐的方式。我如

  • 问题内容: 这是一个演示查询,请注意,这非常简单,仅在base_price为0的地方获取,并且仍然选择条件3: 是 在数据库上运行此命令时,我得到: 3 0 3 0 3 0 3 0 3 0 问题答案: 删除后立即: 有两种不同的形式,如手册中所述。在这里,您要使用第二种形式,因为您正在使用 搜索条件 。

  • 本文向大家介绍如何在MySQL中正确使用WITH ROLLUP?,包括了如何在MySQL中正确使用WITH ROLLUP?的使用技巧和注意事项,需要的朋友参考一下 使用WITH ROLLUP的语法如下- 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是在MySQL中正确使用WITH ROLLUP的查询- 这将产生以下输出-

  • 我试图在我的进程中使用节点模块(在本例中为),如下所示: 注意:功能在我按下