引入包,测试版本:<powermock.version>1.7.1</powermock.version>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>${powermock.version}</version>
    <scope>test</scope>
</dependency>
//aService类的findStudyInfoById方法内部实现,调用了bDao的方法,
//单元测试只需关心aService当前层的正确性,bDao的正确性由它自己的单元测试保证,
//所以需要模拟一个假的bDao场景,来配合完成aService的单元测试
public class MockTest {
    //注入要测试类,注意这里注入写实现类,不能写接口注入
    @InjectMocks
    private AServiceImpl aService;
    //mock这个类,帮助测试aService,而不测试实际的bDao
    @Mock
    private BDao bDao;
    //初始化测试数据
    @Before
    public void initMock() {
        MockitoAnnotations.initMocks(this);
        Student student = new Student;
        student.setName("测试");
        student.setId(1);
        //初始化mock类的场景,如果传入一个int,返回自己mock的student数据
        when(bDao.findStudyInfoById(anyInt())).thenReturn(student);
    @Test
    public void findStudyInfoById() throws Exception {
        List<Student> students = aService.findStudyInfoById(1);
        Assert.assertTrue(rstudents.size()==1);

附遇到的问题:

问题一:mock void方法,不带返回值的方法

AService aService = Mockito.mock(AService.class);
        Mockito.doAnswer(new Answer<Object>() {
            public Object answer(InvocationOnMock invocation) {
                Object[] args = invocation.getArguments();
                return "执行了" + args;
        }).when(aService).findStudent(anyString());

问题二:错误提示

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

解决:比如错误的是这样写的:

when(aService.findStudent("xiaoming",anyList()));

修改一下传入参数,有一个any参数,其中非any参数,都加上eq(),比如"xiaoming",这个就是确定的参数,不是any统配一些类型

when(aService.findStudent(eq("xiaoming"),eq(anyList())));

一般不需要加eq(),但是如果有一个参数需要加,其他参数也应该看看是否需要加上eq()。

问题三:mock类全局变量

引入pom

 <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-reflect</artifactId>
            <version>1.7.1</version>
            <scope>test</scope>
        </dependency>
Whitebox.setInternalState(aService, "mockJzt",1);

这个就mock了,aService类的mockJzt变量,设置为1了

问题四:测试方法内调用多个方法,mock其中几个,剩下的调用不mock,使用真实调用

比如测试A类的findStudent方法,findStudent方法里面调用B类的a,b,c三个方法,mock了a和b方法,调用c真实方法

when(B.a("")).thenReturn(false);
when(B.a("")).thenReturn(false);
when(B.c("")).thenReturn(B.c());

重点就是thenReturn,这个后面如果mock可以返回自己mock的数据,如果不mock可以调用真实的方法,返回真实的值。(需要引入类@Autowire注入使用)

org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi.SimpleNamingContextBuilder.class org.springframework.mock.web.DelegatingServletInputStream.class org.springframework.mock.web.DelegatingServletOutputStream.class org.springframework.mock.web.HeaderValueHolder.class org.springframework.mock.web.MockExpressionEvaluator.class org.springframework.mock.web.MockFilterChain.class org.springframework.mock.web.MockFilterConfig.class org.springframework.mock.web.MockHttpServletRequest.class org.springframework.mock.web.MockHttpServletResponse.class org.springframework.mock.web.MockHttpSession.class org.springframework.mock.web.MockMultipartFile.class org.springframework.mock.web.MockMultipartHttpServletRequest.class org.springframework.mock.web.MockPageContext.class org.springframework.mock.web.MockRequestDispatcher.class org.springframework.mock.web.MockServletConfig.class org.springframework.mock.web.MockServletContext.class org.springframework.mock.web.PassThroughFilterChain.class org.springframework.mock.web.portlet.MockActionRequest.class org.springframework.mock.web.portlet.MockActionResponse.class org.springframework.mock.web.portlet.MockMultipartActionRequest.class org.springframework.mock.web.portlet.MockPortalContext.class org.springframework.mock.web.portlet.MockPortletConfig.class org.springframework.mock.web.portlet.MockPortletContext.class org.springframework.mock.web.portlet.MockPortletPreferences.class org.springframework.mock.web.portlet.MockPortletRequest.class org.springframework.mock.web.portlet.MockPortletRequestDispatcher.class org.springframework.mock.web.portlet.MockPortletResponse.class org.springframework.mock.web.portlet.MockPortletSession.class org.springframework.mock.web.portlet.MockPortletURL.class org.springframework.mock.web.portlet.MockRenderRequest.class org.springframework.mock.web.portlet.MockRenderResponse.class org.springframework.test.AbstractDependencyInjectionSpringContextTests.class org.springframework.test.AbstractSingleSpringContextTests.class org.springframework.test.AbstractSpringContextTests.class org.springframework.test.AbstractTransactionalDataSourceSpringContextTests.class org.springframework.test.AbstractTransactionalSpringContextTests.class org.springframework.test.AssertThrows.class org.springframework.test.ConditionalTestCase.class org.springframework.test.annotation.AbstractAnnotationAwareTransactionalTests.class org.springframework.test.annotation.DirtiesContext.class org.springframework.test.annotation.ExpectedException.class org.springframework.test.annotation.IfProfileValue.class org.springframework.test.annotation.NotTransactional.class org.springframework.test.annotation.ProfileValueSource.class org.springframework.test.annotation.Repeat.class org.springframework.test.annotation.SystemProfileValueSource.class org.springframework.test.annotation.Timed.class org.springframework.test.jpa.AbstractAspectjJpaTests.class org.springframework.test.jpa.AbstractJpaTests.class org.springframework.test.jpa.OrmXmlOverridingShadowingClassLoader.class org.springframework.test.web.AbstractModelAndViewTests.class 项目开发中需要将file转化为MultipartFile,网上百度发现使用org.springframework.mock.web.MockMultipartFile可以 File file3 = new File(fileMap.get("file").toString()); FileInputStream in_file = new FileInputStream(file3);... 思路:路径创建出File文件型的对象,然后通过MultipartFile对象的MockMultipartFile方法将生成的File文件转化为MultipartFile文件,上代码; controller层: package com.java.product.module.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframew. 报错解决方法: 错误1:When using matchers, all arguments have to be provided by matchers. 原因:从异常的信息来看,显然违反了一个Mockito框架中的Matchers匹配参数的规则。根据Matchers文档如下,在打桩阶段有一个原则,一个mock对象的方法,如果其若干个参数中,有一个是通过Matchers提供的,则该方法的所有参数都必须通过Matchers提供。而不能是有的参数通过Matchers提供,有的参数直接给出真实的具体值。 fileMultipartFile的时候会用到MockMultipartFile 当你导入spring-test依赖的时候 会跟某些依赖冲突(暂未找到具体是哪个冲突) 解决方法 重写一个去实现MultipartFile接口 直接用MockMultipartFile的源码 public class MultipartFileDto implements MultipartFile { private final String name; private String origi 首先,简单说说PowerMockito进行单元测试的三部曲:打桩,即为非测试目标方法设置返回值,这些返回值在测试目标方法中被使用。执行测试,调用测试目标方法。验证测试结果,如测试方法是否被执行,测试结果是否正确等。其次,在使用PowerMockito框架进行单元测试的过程中,经常遇到如下异常:Invalid use of argument matchers! 0 matchers expected... ClassPathResource resource = new ClassPathResource("XXX.js"); MockMultipartFile mfile = new MockMultipartFile("file", "XXX.js", "png", resource.getInputStream()); MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.multipart("/XX.. 微服务项目中服务调用需要生成multipartFile问题的几种解决方案。1、引入test,使用test中的MockMultipartFile。2、自定义实现一个MockMultipartFile(推荐) 对于做操作系统的开发者来讲,一个干净的环境尤为重要。就我所接触的,能够实现自己的环境不被其他人“打扰”,有容器,chroot和mock环境了。前面两个超级简单,一个直接run镜像,一个就是chroot到某个文件系统,稍微复杂一点就是如何搭建属于自己的mock环境了,接下来就实操一下。 操作系统环境 [root@localhost ~]# cat /etc/.productinfo KYLIN Linux Advanced Server Release V10(SP1)/(Tercel)-sw64-B import org.mockito.InjectMocks; import org.mockito.Mock; import org.powermock.api.mockito.PowerMockito; import org.junit.runner.RunWith; import org.junit.Test; import static org.junit.Assert.... org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 4 matchers expected, 3 recorded: -> at com.yihaodian.wap.service.AddressSer... 可以看到MultipartFile是个接口 转成MultipartFile格式则需要转成实现MultipartFile接口的实现即可,如下选择转成用MockMultipartFile实现 首先:需要先引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.9</ Github地址 Mock测试技术能够避免你为了测试一个方法,却需要自行构建整个依赖关系的工作,并且能够让你专注于当前被测试对象的逻辑,而不是其依赖的其他对象的逻辑。 举例来说,比如你需要测试Foo.methodA,而这个方法依赖了Bar.methodB,又传递依赖到了Zoo.methodC,于是它们的依赖关系就是Foo->Bar-...