1.版本要对应起来,否则怎么都报错
mockito 版本来源:
- 1.来自于maven配置
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
-
- 来源于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));
}
}