java的单元测试-mock测试

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

简介

对于普通的方法,通常采用断言测试。
对于接口,需要使用mockMvc
对于未开发的功能,需要mockBean模拟一个业务bean

Assert

java自身携带的工具类,也可以用于一些对抛出异常要求不高的业务或者存在全局异常的项目

Assert.notNull(in,"入参不存在");

另外有一个更加简单的写法,以assert开头

assert method != null;

mockMVC

曾使用注入方式得到mockMvc,类加上@WebMvcTest注解,实际测试发现这样回影响service bean的注入。

@Slf4j
@SpringBootTest
public class MvcTest {
    private MockMvc mockMvc;
    @Autowired
    protected WebApplicationContext wac;

    @SneakyThrows
    @Test
    void testGetOne(){
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        TestGeOne in = new TestGeOne();
        in.setId(1);
        JSONObject jsonObject = new JSONObject();
        mockMvc.perform(MockMvcRequestBuilders.post("/test/getOne").content(JSON.toJSONBytes(in)).contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpectAll(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON),
                        MockMvcResultMatchers.jsonPath("$.data.id",Is.is(1)),
                        MockMvcResultMatchers.jsonPath("$.data.name").isString())
                .andDo(MockMvcResultHandlers.print());
    }
}

优化

添加BeforeEach注解,用于每次初始化mock

    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;

    @MockBean
    private TestServcie testServcie;

    //在每个测试方法执行之前都初始化MockMvc对象
    @BeforeEach
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

mockBean(模拟bean和测试接口)

关键引用import static org.mockito.Mockito.*;
否则使用Mockito.when
另外就是在接口或者实现方法上加MockBean,这里注解可以放接口也可以具体的实现service。

注意mock(TestGetOneRes.class);实际测试中存在问题

@Slf4j
@SpringBootTest
public class MockBeanTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;

    @MockBean
    private TestServcie testServcie;

    //在每个测试方法执行之前都初始化MockMvc对象
    @BeforeEach
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        TestGetOneRes testGetOneRes = new TestGetOneRes();
        testGetOneRes.setId(1);
        testGetOneRes.setName("mock 测试");
        //静态导入import static org.mockito.Mockito.*;才能使用when方法
        when(testServcie.getOne(1)).thenReturn(testGetOneRes);
        //另一种写法
        TestGetOneRes testGetOneRes2 = new TestGetOneRes();
        testGetOneRes2.setId(2);
        doReturn(testGetOneRes2).when(testServcie).getOne(2);
    }

    @SneakyThrows
    @Test
    void testGetOne(){
        TestGeOne in = new TestGeOne();
        in.setId(1);
        Assert.notNull(in,"入参不存在");
        mockMvc.perform(MockMvcRequestBuilders.post("/test/getOne").content(JSON.toJSONBytes(in)).contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpectAll(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON),
                        MockMvcResultMatchers.jsonPath("$.data.id", Is.is(1)),
                        MockMvcResultMatchers.jsonPath("$.data.name").isString())
                .andDo(MockMvcResultHandlers.print());
    }

}

当出现多个mock都符合条件的时候,一般是最后一条mock生效。
但是如果中间出现抛异常,就直接返回了文章来源地址https://www.toymoban.com/news/detail-401280.html

        //入参等于某个值
        Mockito.when(testServcie.getOne(Mockito.eq(1))).thenReturn(testGetOneRes);
        //任意值
        Mockito.when(testServcie.getOne(Mockito.any())).thenReturn(testGetOneRes);
        //抛异常
        Mockito.when(testServcie.getOne(Mockito.isNotNull())).thenThrow(MyException.class);
        //自定义
        Mockito.when(testServcie.getOne(Mockito.anyInt())).thenAnswer(new Answer() {
            @Override
            public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
                Method method = invocationOnMock.getMethod();
                Object[] arguments = invocationOnMock.getArguments();
                //这里是因为只有一个入参,所以就直接使用第一参数
                Integer id = (Integer)arguments[0];
                TestGetOneRes testGetOneRes = new TestGetOneRes();
                testGetOneRes.setId(id);
                testGetOneRes.setName(id + ":" + new Date().toString());
                return testGetOneRes;
            }
        });

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

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

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

相关文章

  • Java的单元测试Testng和mock

    目录 单元测试重要性 TestNG TestNG官网介绍 TestNG教程 TestNG注解: 

    2024年02月07日
    浏览(8)
  • junit单元测试mock私有private方法和静态static方法

    我们知道org.mockito.Mockito功能有限,不能mock 私有private、受保护的protected方法 org.powermock.api.mockito.PowerMockito更强大,支持对private和protected和static方法的mock 别忘记,首先要引入maven依赖 有如下私有方法需要mock 这时候可以利用PowerMockito的spy方法mock出方法所在的对象,然后利用

    2024年02月12日
    浏览(9)
  • Java用正确的姿势写单元测试以及mock

    对于一些简单的功能或业务,我们也许可以通过前端调试、postman等接口工具、main函数调用进行测试。但这每次改动代码都要人力测试,耗费大量的人力资源且不高效,真正的项目中单元测试是必不可少的。 单元测试的三步走: 1、组装方法入参 2、执行方法 3、对方法的执行

    2024年02月13日
    浏览(10)
  • 在Java微服务项目中,如何使用Mock来进行单元测试?

    在Java微服务项目中,如何使用Mock来进行单元测试?

    摘要: 在系统开发的过程中,单元测试是其中的一个重要环节。在Java微服务项目中,Spring框架本身就为我们提供了一套单元测试的框架SpringBootTest。如果我们在学校完成课堂作业或出于兴趣爱好自学,是可以使用Spring自带的单元测试框架进行单测的。 工作中,这种通过Spri

    2024年02月16日
    浏览(10)
  • 大型企业通常如何进行单元测试?

    大型企业通常如何进行单元测试?

    你平时是怎么做 单元测试 的? 面试官心理预期 面试官询问单元测试并非仅仅想了解这一概念,背后可能考察面试者以下三个方面: · 对软件工程生命周期的熟悉程度,以及对测试阶段各种方法(包括单元测试、集成测试、冒烟测试等)和其重要性的理解。 ·  面试者是否

    2024年04月11日
    浏览(9)
  • 非Springboot项目使用powermockito单元测试 mock静态方法和ScriptEngineManager providers.next()...not a subtype报错解决

    非Springboot项目使用powermockito单元测试 mock静态方法和ScriptEngineManager providers.next()...not a subtype报错解决

    使用PowerMockito.mockStatic() 加上@RunWith和@PrepareForTest注释 如果报错下面的错则考虑加上@PowerMockIgnore ERROR StatusLogger Unable to unregister MBeans java.lang.LinkageError: javax/management/MBeanServer(具体如下) 解决:加上@PowerMockIgnore(\\\"javax.management.*) ScriptEngineManager providers.next(): javax.script.ScriptEng

    2024年02月15日
    浏览(11)
  • Service层代码单元测试以及单元测试如何Mock

    Service层代码单元测试以及单元测试如何Mock

    接着上一篇文章:单元测试入门篇,本篇文章作为单元测试的进阶篇,主要介绍如何对Springboot Service层代码做单元测试,以及单元测试中涉及外调服务时,如何通过Mock完成测试。 现在项目都流行前后端代码分离,后端使用springboot框架,在service层编写接口代码实现逻辑。假设

    2023年04月08日
    浏览(7)
  • 单元测试与Mock

    单元测试与Mock

    作者:一笑钦陈 邮箱:xianqin_chen@163.com 你好,我是一笑钦陈,《零零后程序员成长之路》作者,一线互联网 Java 工程师。很高兴你阅读我的博客,让我们共同成长进步! 提醒:在接下来您对本博客的阅读中,如果遇到一些内容、图稿、代码等中的勘误都可以通过邮件进行反

    2024年02月08日
    浏览(7)
  • Testify Mock 单元测试

    Testify 提供了单测方便的断言能力,这里的断言是将对代码实际返回的断言,代码的实际输出和预期是否一致。下面是 gin-gonic/gin 代码库的单测代码,Testify 还提供了很多其他的方法: 单元测试中也会存在不稳定的代码,我们的入参虽然保持不变,但每次单测的结果可能会发

    2024年02月03日
    浏览(6)
  • 单元测试junit+mock

    单元测试junit+mock

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通常和白盒测试联系到一起 ,如果单从概念上来讲两者是有区别的,不过我们通

    2024年02月08日
    浏览(6)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包