一、问题背景
给spring boot项目添加powermock组件,解决单测mock问题。
- 添加如下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>
- 用框架生成一个简单单测
- 然后给单测类增加Mock对象、InjectMock对象
- 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); } }
- 运行单测,报如下错误
这个是any()函数导致的报错。java.lang.AbstractMethodError: org.powermock.api.mockito.internal.exceptions.StackTraceCleanerProvider$1.isIn(Ljava/lang/StackTraceElement;)Z
二、问题原因探寻
找寻any函数是哪里的, 发现是mockito-core中的,怀疑是jar包依赖冲突导致的报错,修改jar包依赖如下:
- 排除powermock-module-junit4中的mockito-core
- 排除powermock-api-mockito中的mockito-core
- 排除spring-boot-starter-test中的mockito-core
- 新增如下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);
}
}