【SpringBoot】mockito+junit 单元测试

这篇具有很好参考价值的文章主要介绍了【SpringBoot】mockito+junit 单元测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.POM 引入以下依赖

      <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.5.2</version>
            <scope>test</scope>
        </dependency>

2.Service层接口单元测试示例

package xxx.xxx.xxx;

import org.apache.commons.collections.CollectionUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Arrays;



@RunWith(MockitoJUnitRunner.class)
@Slf4j
class CommonServiceImplTest {


    @Autowired
    @InjectMocks
    CommonServiceImpl commonService;

    @Mock
    ServiceA  serviceA;

    @Mock
    ServiceB  servieB;



    private QueryBo queryBO;



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

    @Test
    void getSourceCodeMap() {
        queryBO = new QueryBO();
        queryBO.setFieldA("A");
        queryBO.setFieldB("B"); 

        CommonEntity entity = new CommonEntity ();
        entity.setField1("1");
        entity.setField2("2");
        Mockito.when(serviceA.list(queryBO)).thenReturn(Arrays.asList(new CommonEntity []{entity}));
        Assert.assertNotNull(commonService.getSourceCodeMap());
    }

CommonServiceImpl 在方法getSourceCodeMap()调用了ServiceA的方法list(QueryBO queryBo)

3. 常见问题

3.1 MockitoException

org.mockito.exceptions.base.MockitoException:
No tests found in ClientSyncServiceImplTest
Is the method annotated with @Test?
Is the method public?
【SpringBoot】mockito+junit 单元测试,spring boot,单元测试
解决方案:
Test引入org.junit.Test 不要引入org.junit.jupiter.api.Test
【SpringBoot】mockito+junit 单元测试,spring boot,单元测试

3.2 ThreadLocal类对象Mock

例如获取当前用户

@Component
public class CurrentUtil {
    public CurrentUtil() {
    }

    public static Optional<User> getUser() {
        return Optional.ofNullable(((CommonAuditService)SpringContextUtil.getBean(CommonAuditService.class)).getUser(new String[0]));
    }

 }

mock示例:

public XXXTest{
    // ....

    @Before
    public void setUp(){
        MockitoAnnotations.openMocks(this);
        MockedStatic<CurrentUtil> userUtil = Mockito.mockStatic(CurrentUtil.class);
        userUtil.when(()->CurrentUtil.getUser()).thenReturn(1L);
    }
	//...
}

3.3 MybatisPlusException

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: com.cscs.icrg.universal.rating.entity.UniMainScaleDetailEntity Not Found TableInfoCache.
at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:49)

【SpringBoot】mockito+junit 单元测试,spring boot,单元测试
解决方法如下:


public XXXTest{
    // ....

    @Before
    public void setUp(){
		 TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(),""), XXXXEntity.class);

        // ...
    }
	//...
}

3.3 void方法调用

使用doNothing()

@Test
public void test() {
   doNothing().when(mockedService).updateXXX(anyLong(),anyString());
 
   userService.updateName(1L,"11");
     
   verify(mockedService, times(1)).updateXXX(1L,"dddd");
}

3.4 运行时注入

使用反射修改,例如

服务AServiceImpl

public class AServiceImpl implements Service{
	//....

	private ClassXXX fieldPostInitBean;

	@PostContruct
	void init() {
		fieldPostInitBean = SpringContextUtil.getBean(xxxxx);
	}
	//...

}

AServiceImplTest文章来源地址https://www.toymoban.com/news/detail-698928.html

//...
public Class AServiceImplTest {

	@InjectMock
	AServiceImpl impl;

	@Mock
	ClassXXX fieldPostInitBean;

	@Before
	void before() {
	  MockitoAnnotations.initMocks(this);
      Field field = IcrgWarningWorkflowServiceImpl.class.getDeclaredField("fieldPostInit");
      field.setAccessible(true);
      field.set(this.impl,fieldPostInitBean);
	}
	//....
}

到了这里,关于【SpringBoot】mockito+junit 单元测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 实战:JUnit5+MockMvc+Mockito 做好单元测试

    因为继承了 spring-boot-starter-parent ,所以我们依赖的 spring-boot-starter-test 不需要写具体的版本,可以直接集成父级的版本定义。其中, spring-boot-starter-web 是用于提供 REST API 的 web 容器, spring-boot-starter-test 可以提供各种测试框架的, spring-boot-maven-plugin 是将 SpringBoot 应用打包为

    2024年04月15日
    浏览(52)
  • springboot项目使用Junit5 + mockito + jacoco 实现单元测试以及代码覆盖率检查

    在创建springboot项目时会默认添加spring-boot-starter-test依赖,其中已经包含了junit、mockito依赖,根据springboot版本的不同junit和mockito的版本也会有所不同 先说一下各自功能: junit只说一点,junt4和junit5的注解不同,使用方式略有差异,其他不赘述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    浏览(55)
  • 在Spring Boot环境中使用Mockito进行单元测试

    Mockito是一个流行的Java mocking框架,它允许开发者以简单直观的方式创建和使用模拟对象(mocks)。Mockito特别适用于在Spring Boot环境中进行单元测试,因为它能够轻松模拟Spring应用中的服务、存储库、客户端和其他组件。通过使用Mockito,开发者可以模拟外部依赖,从而使单元测

    2024年03月23日
    浏览(49)
  • 单元测试junit(原始版本、Spring Boot各版本、junit5)使用介绍

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 单元测试 junit各版本 使用介绍 官

    2023年04月16日
    浏览(41)
  • JUnit 5单元测试(三)—— Mockito 模拟

    上一篇讲了 JUnit 5单元测试(二)—— 断言,书接上文开始 JUnit 5单元测试(三)—— Mockito 模拟 想象下面这几种情况你该怎么单元测试: 1.A方法去数据库查询了数据进行了一些处理,该怎么单元测试; 2.在微服务项目中,A方法中调用了远程微服务B方法(或者B方法还没写好

    2024年02月15日
    浏览(51)
  • Junit5+Mockito单元测试详解

    1.宏观层面:AIR原则 A:Automatic(自动化) 全自动执行,输出结果无需人工检查,而是通过断言验证。 I:Independent(独立性) 分层测试,各层之间不相互依赖。 R:Repeatable(可重复) 可重复执行,不受外部环境( 网络、服务、中间件等)影响。 2.微观层面:BCDE原则 B: Bord

    2024年01月17日
    浏览(45)
  • Java单元测试浅析(JUnit+Mockito)

    Java测试我们应该都遇到过,一般我们会被要求做单元测试,来验证我们代码的功能以及效率。 这里来和大家一起探讨下有关单于测试。 是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单

    2024年02月06日
    浏览(60)
  • Junit4 + Mockito进行单元测试实战案例

    ​ 实战代码案例: ​​​​​​​​​​​ 注意:idea2021.3.3之前的版本都搜索不到这个插件。 使用TestMe自动生成单元测试代码: 不是自动化执行的单元测试都是无意义的,项目中那么多单测,难道一个一个点吗? 引入maven-surefire-plugin插件用于自动化执行单测。 include里表

    2024年02月16日
    浏览(52)
  • 单元测试编写最佳实践(ChatGPT+Mockito+JUnit)

    基于 springboot 微服务架构给单元测试带来的问题: springboot 单元测试启动家长过程非常缓慢,后期服务启动达到分钟级,非常影响效率 服务之间相互依赖非常严重,单元测试的运行非常依赖其它服务稳定性 第三方服务和中间件,测试过程产生大量垃圾数据,污染环境,非常

    2024年02月09日
    浏览(45)
  • 单元测试-spring-boot-starter-test+junit5

    开发过程中经常需要写单元测试,记录一下单元测试spring-boot-starter-test+junit5的使用 引用jar包 可以对局部函数、方法进行调用测试 可以对API调用进行模拟测试

    2024年01月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包