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
    评论
Spring Boot是一个非常流行的Java框架,MockitoPowerMock是两个常用的Java测试框架。集成MockitoPowerMock可以帮助我们更好地进行单元测试和集成测试。下面是Spring Boot集成MockitoPowerMock的步骤: ### 1. 添加依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.10.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> ``` ### 2. 编写测试类 编写需要测试的类和测试类,例如: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } } @RunWith(PowerMockRunner.class) @PrepareForTest(UserRepository.class) public class UserServiceTest { @InjectMocks private UserService userService; @Mock private UserRepository userRepository; @Test public void testGetUserById() { Long id = 1L; User user = new User(); user.setId(id); user.setName("MockitoTest"); Mockito.when(userRepository.findById(id)).thenReturn(Optional.of(user)); User result = userService.getUserById(id); Assert.assertEquals(result.getName(), "MockitoTest"); } } ``` ### 3. 运行测试 运行测试类,如果测试通过,则说明MockitoPowerMock已经成功集成到Spring Boot中。 以上是Spring Boot集成MockitoPowerMock的基本步骤。需要注意的是,MockitoPowerMock虽然可以帮助我们进行更好的测试,但是过度使用也会导致测试变得复杂和难以维护,因此需要谨慎使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值