powerMock 使用

1.版本要对应起来,否则怎么都报错

mockito 版本来源:

  • 1.来自于maven配置
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.19</version>
</dependency>
    1. 来源于spring-boot-starter-test
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • 3.版本一致的办法:直接引用所有版本匹配的测试类
    • 这几个版本既然匹配才能使用,我直接把他们引用进来,这样spring-boot-starter-test中依赖的mockito-core就会被覆盖掉
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.19</version>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>
  • 4.当然最好的方式是先把spring-boot-starter-test中的mockito-core依赖给剔除掉,然后再引入我们需要的版本,像下面这样
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <!--剔除依赖进来的org.mockito-->
    <!--<exclusions>-->
        <!--<exclusion>-->
            <!--<groupId>org.mockito</groupId>-->
            <!--<artifactId>mockito-core</artifactId>-->
        <!--</exclusion>-->
    <!--</exclusions>-->
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.19</version>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>
Mockito                     | PowerMock
------------------------------------------------------------------------------
2.0.0-beta - 2.0.42-beta    |   1.6.5+
------------------------------------------------------------------------------
1.10.19                     |   1.6.4
1.10.8 - 1.10.x             |   1.6.2+
1.9.5-rc1 - 1.9.5           |   1.5.0 - 1.5.6
1.9.0-rc1 & 1.9.0           |   1.4.10 - 1.4.12
1.8.5                       |   1.3.9 - 1.4.9
1.8.4                       |   1.3.7 & 1.3.8
1.8.3                       |   1.3.6
1.8.1 & 1.8.2               |   1.3.5
1.8                         |   1.3
1.7                         |   1.2.5

2.测试类上添加PowerMockIgnore

@PowerMockIgnore(“javax.management.*”)

3.例子

  • 静态类
package com.finup.loan.config;


public class DemoStatic {
    /**
     * 无参数静态方法
     * @return
     */
    public static String sayHello() {
        return "Hello";
    }

    /**
     * 有参数静态方法
     * @param word
     * @return
     */
    public static String saySomething(String word) {
        return word;
    }

    public static void sayAgain() {
        System.out.println(getMyWord());
    }

    /**
     * 私有方法
     * @return
     */
    private static String getMyWord() {
        return "This is my word";
    }
}

  • 测试类
package com.finup.loan.mock;

import com.finup.loan.config.DemoStatic;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@RunWith(PowerMockRunner.class)
@PrepareForTest(DemoStatic.class)
@PowerMockIgnore("javax.management.*")
public class StaticTests {
    private static final Logger logger = LoggerFactory.getLogger(StaticTests.class);

    /**
     * 无参数静态方法
     */
    @Test
    public void testMockSayHello() {
        PowerMockito.spy(DemoStatic.class);
        PowerMockito.when(DemoStatic.sayHello()).thenReturn("mock hello");
        logger.info("无参数静态方法测试完毕");
    }

    /**
     * 带参数静态方法
     */
    @Test
    public void saySomething() throws Exception {
        PowerMockito.spy(DemoStatic.class);
        PowerMockito.when(DemoStatic.class, "saySomething", Mockito.anyString()).thenReturn("something to say");
        logger.info(DemoStatic.saySomething("hello world."));
    }

    /**
     * private 静态方法
     */
    @Test
    public void sayAgain() throws Exception {
        PowerMockito.spy(DemoStatic.class);
        PowerMockito.when(DemoStatic.class, "getMyWord").thenReturn("Nothing to say");
        DemoStatic.sayAgain();
    }

}

4.service、mapper和静态类一起使用

package com.bsx.test;

import com.alibaba.fastjson.JSONObject;
import com.bsx.test.constant.Gender;
import com.bsx.test.entity.Student;
import com.bsx.test.mapper.StudentMapper;
import com.bsx.test.service.impl.StudentServiceImpl;
import com.bsx.test.utils.DemoStatic;
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.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tk.mybatis.mapper.entity.Config;
import tk.mybatis.mapper.mapperhelper.EntityHelper;

import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.when;

/**
 * 静态发方法和mapper,service结合
 * 如果出现了
 * 无法获取实体类com.test.entity.Student对应的表名!问题的时候,需要执行下面的一条初始化语句
 * EntityHelper.initEntityNameMap(Test.class, new Config());
 * 依赖的类都来自于tk.mybatis
 * import tk.mybatis.mapper.entity.Config;
 * import tk.mybatis.mapper.mapperhelper.EntityHelper;
 */

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*"})
@PrepareForTest(DemoStatic.class)
public class StaticWebTests {
    private static final Logger logger = LoggerFactory.getLogger(StaticWebTests.class);
    @Mock
    private StudentMapper studentMapper;

    @InjectMocks
    private StudentServiceImpl studentServiceImpl;

    @Before
    public void setUp() throws Exception {
        PowerMockito.spy(DemoStatic.class);
        PowerMockito.when(DemoStatic.class, "saySomething", Mockito.anyObject()).thenReturn("mock hello");
        Student student = new Student();
        student.setcId(1);
        student.setGender(Gender.Female);
        student.setId(1);
        student.setName("dada");
        when(studentMapper.findById(anyInt())).thenReturn(student);
    }

    @Test
    public void testFindById() throws Exception {
        logger.info(DemoStatic.saySomething("123"));
        // 如果执行过程中出现了:无法获取实体类com.test.entity.Student对应的表名!
        // 就使用下面的方式初始化
        EntityHelper.initEntityNameMap(Student.class, new Config());
        Student student = studentServiceImpl.findById(1);
        logger.info(JSONObject.toJSONString(student));
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值