赞
踩
先添加依赖powermock
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>
指定执行方式
@RunWith(PowerMockRunner.class)
指定需要被mock的静态类
@PrepareForTest({ LoginUtil.class })
mock方法
PowerMockito.mockStatic(LoginUtil.class);
PowerMockito.when(LoginUtil.getUser()).thenReturn(new LoginUser());
Mockito.when(tairService.get(Mockito.anyString(), Mockito.any(Class.class))).thenReturn(new LoginUser());
};
@Mock
private ProjectFollowUpService
这是一个mock的service对象,当启动容器的时候,在此生成一个mock对象,而且ProjectSearchController 这个对象必须是支持该service的set方法的时候并且 有@InjectMocks注解这个时候才会注入mock对象
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@RunWith(SpringJUnit4ClassRunner.class)
这两种启动方式造成的如下现象,通过二次派生启动spring容器的时候dubbo的服务看似启动了,但是总是会出现dubbo服务找不到的问题,这个目前还在寻找答案
但是ProjectSearchController 中注入的确实dubbo接口的代理对象。因此会报异常提示找不到ProjectFollowUpService 的dubbo的服务。这种情况需要在@before中把mock生成的实例对象手动的通过set方法set到ProjectSearchController 中去才行。
//使用这个跑单测会加载整个容器
//@RunWith(SpringJUnit4ClassRunner.class)
//使用这个跑单测,所有的服务都需要mock,不会加载容器支持静态方法mock
@RunWith(PowerMockRunner.class)
//@SpringApplicationConfiguration(classes = Application.class)
//@WebAppConfiguration
//在这个位置指定需要被mock的静态资源类 @1
@PrepareForTest({ LoginUtil.class })
public class ProjectSearchControllerTest {
@Autowired
@InjectMocks
private ProjectSearchController projectSearchController;
// @Mock(name = "projectFollowUpService")
@Mock
private ProjectFollowUpService projectFollowUpService;
@Mock
private TairService tairService;
@Before
public void before() {
//静态方法mock @2
PowerMockito.mockStatic(LoginUtil.class);
Mockito.when(projectFollowUpService.queryProjectFollowUpListByEmployId(Mockito.anyList())).thenReturn(
Lists.newArrayList(1L));
//静态方法mock @3 PowerMockito.when(LoginUtil.getUser()).thenReturn(new LoginUser());
//&&&这个地方需要重点关注下,当 mock使用any的时候一旦有一个参数使用any,则所有参数必须使用any匹配 Mockito.when(tairService.get(Mockito.anyString(), Mockito.any(Class.class))).thenReturn(new LoginUser());
};
@Test
public void search() {
ProjectSearchParam param = new ProjectSearchParam();
param.setEmpId("WB199502");
projectSearchController.search(param);
}
}
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。