SpringBoot单元测试之mock静态方法

1 为什么要对静态方法mock

mockito库并不能 mock静态方法,需要依赖powermock才能对静态方法mock

2 如何使用powermock对静态方法mock

2.1 添加依赖

顺便添加对JsonPath的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <properties>
    <powermock.version>1.7.0RC4</powermock.version>
    <mockito.version>2.7.5</mockito.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.jayway.jsonpath</groupId>
      <artifactId>json-path</artifactId>
      <version>2.4.0</version>
      <scope>test</scope>
    </dependency>
    <!-- powermock -->
    <!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito -->
    <dependency><!-- 如果不是springboot,不需要加这个 -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.mockito</groupId>
          <artifactId>mockito-core</artifactId>
        </exclusion>
      </exclusions>
      <scope>test</scope>
    </dependency>
    <!-- powermock -->
    <!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito -->
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito2</artifactId>
      <version>${powermock.version}</version>
      <exclusions>
        <exclusion>
          <groupId>org.mockito</groupId>
          <artifactId>mockito-core</artifactId>
        </exclusion>
      </exclusions>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>${powermock.version}</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4-rule -->
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4-rule</artifactId>
      <version>${powermock.version}</version>
      <exclusions>
        <exclusion>
          <groupId>org.mockito</groupId>
          <artifactId>mockito-core</artifactId>
        </exclusion>
      </exclusions>
      <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-core</artifactId>
      <version>${mockito.version}</version><!--$NO-MVN-MAN-VER$-->
      <scope>test</scope>
    </dependency>

  </dependencies>

  <build>
    <finalName>nef-server</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

2.2 编写测试类

前提:junit用的是4.12
工具类

public class IDUtil {

    public static String getSubscriptionId() {
        String localhost = NetUtil.getLocalhostStr();
        log.info("获取到的本地URL是:{}", localhost);
        return IdUtil.getSnowflake(Math.abs(localhost.hashCode()) % 32,
                Math.abs(localhost.hashCode()) % 32).nextIdStr();
    }
}

测试类

/**
 * <p>事件订阅测试类</p>
 *
 * @Author: lid
 * @Date: 2020-08-19
 */
@RunWith(PowerMockRunner.class) // 步骤1
@PowerMockRunnerDelegate(SpringRunner.class)// 步骤2
@PowerMockIgnore( {"javax.management.*", "javax.net.*"})// 步骤3
@PrepareForTest(IDUtil.class)// 步骤4:指定提前mock哪个类
@SpringBootTest()
public class HelloTest {
    @Autowired(required = true)
    private WebApplicationContext webApplicationContext;

    @Autowired(required = false)
    private MockMvc mockMvc;

 	@Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); //步骤5
        PowerMockito.mockStatic(IDUtil.class);
    }
    
	@Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
        PowerMockito.mockStatic(IDUtil.class);// 步骤6
    }
}

测试结果

打印结果:
hello

2.3 需要注意的问题

有时候单个方法测试可以通过,但是整个测试类一直运行时通不过,powermockmockito版本适配如下:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值