当前位置:   article > 正文

springboot+mockito (二)mock_mock any

mock any

使用mock测试静态方法

先添加依赖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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

指定执行方式

@RunWith(PowerMockRunner.class)
  • 1

指定需要被mock的静态类

@PrepareForTest({ LoginUtil.class })
  • 1

mock方法

 PowerMockito.mockStatic(LoginUtil.class);
 PowerMockito.when(LoginUtil.getUser()).thenReturn(new LoginUser());
  • 1
  • 2

当 mock使用any的时候一旦有一个参数使用any,则所有参数必须使用any匹配

Mockito.when(tairService.get(Mockito.anyString(), Mockito.any(Class.class))).thenReturn(new LoginUser());
    };
  • 1
  • 2
  • 3

启动spring容器自动注入mock dubbo接口问题

@Mock
private ProjectFollowUpService  
  • 1
  • 2

这是一个mock的service对象,当启动容器的时候,在此生成一个mock对象,而且ProjectSearchController 这个对象必须是支持该service的set方法的时候并且 有@InjectMocks注解这个时候才会注入mock对象

这个讲的是

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
  • 1
  • 2
@RunWith(SpringJUnit4ClassRunner.class)
  • 1

这两种启动方式造成的如下现象,通过二次派生启动spring容器的时候dubbo的服务看似启动了,但是总是会出现dubbo服务找不到的问题,这个目前还在寻找答案

但是ProjectSearchController 中注入的确实dubbo接口的代理对象。因此会报异常提示找不到ProjectFollowUpService 的dubbo的服务。这种情况需要在@before中把mock生成的实例对象手动的通过set方法set到ProjectSearchController 中去才行。
  • 1

完整的测试类,上面说的不明白的key参考下面的代码

//使用这个跑单测会加载整个容器
//@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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/366836
推荐阅读
相关标签
  

闽ICP备14008679号