springboot项目添加powermock遇到的StackTraceCleanerProvider问题

一、问题背景

给spring boot项目添加powermock组件,解决单测mock问题。

  1. 添加如下powermock依赖
    <!-- powermock utils -->
         <dependency>
             <groupId>org.javassist</groupId>
             <artifactId>javassist</artifactId>
             <version>3.20.0-GA</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.powermock</groupId>
             <artifactId>powermock-module-junit4</artifactId>
             <version>${powermock.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.powermock</groupId>
             <artifactId>powermock-api-mockito</artifactId>
             <version>${powermock.version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
    
  2. 用框架生成一个简单单测
  3. 然后给单测类增加Mock对象、InjectMock对象
  4. mock DAO函数调用
    @RunWith(PowerMockRunner.class)
    @PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.", "javax.net.ssl." , "javax.crypto.*"})
    public class SomeServiceImplTest {
        @Mock
        private SomeDAO someDAO;
        
        @InjectMocks
        private SomeServiceImpl someServiceImpl;
        
        @Test
        public void callSomeMethod() {
            PowerMockito.when(someDAO.insertSelective(any())).thenReturn(1);
            ...
            assertTrue(someServiceImpl.callSomeMethod() == null);
         }
     }
    
  5. 运行单测,报如下错误
    java.lang.AbstractMethodError: org.powermock.api.mockito.internal.exceptions.StackTraceCleanerProvider$1.isIn(Ljava/lang/StackTraceElement;)Z
    
    这个是any()函数导致的报错。

二、问题原因探寻

找寻any函数是哪里的, 发现是mockito-core中的,怀疑是jar包依赖冲突导致的报错,修改jar包依赖如下:

  1. 排除powermock-module-junit4中的mockito-core
  2. 排除powermock-api-mockito中的mockito-core
  3. 排除spring-boot-starter-test中的mockito-core
  4. 新增如下mockito-all依赖
    <dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-all</artifactId>
     <version>1.10.19</version>
     <scope>test</scope>
    </dependency>
    

三、问题解决

用mockito-all-1.10.19.jar里面的org.mockito.Matchers中的anyObject函数,单测可以执行成功。

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.", "javax.net.ssl." , "javax.crypto.*"})
public class SomeServiceImplTest {
    @Mock
    private SomeDAO someDAO;
    
    @InjectMocks
    private SomeServiceImpl someServiceImpl;
    
    @Test
    public void callSomeMethod() {
        PowerMockito.when(someDAO.insertSelective(anyObject())).thenReturn(1);
        ...
        assertTrue(someServiceImpl.callSomeMethod() == null);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值