1    Mockito  使用

1.1    引入Mockito依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.23.4</version>
            <scope>test</scope>
        </dependency>
 
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.3.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

 

1.2    使用注意事项

Mock bean顺序问题,异常放到最后 

 

2    Mockito Demo

2.1    Demo  正常

 test类

package com.ddwei.moduleA.service.impl;

import com.ddwei.api.bff.moduleA.dto.request.CallServerQuery;
import com.ddwei.api.bff.moduleA.dto.response.CallServerDto;
import com.ddwei.api.exception.DBusinessException;
import com.ddwei.infrastructure.referenceservice.ComcACLService;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class CallServerServiceImplTest{

    @Mock
    public ComcACLService comcACLService;

    @InjectMocks
    CallServerServiceImpl callServerServiceImpl;
    /**
     * 测试 调用防腐层方法 methodA
     * @author weidoudou
     * @date 2022/2/17 12:57
     * @param
     * @return void
     **/
    @Test
    public void methodA() throws DBusinessException {

        //1     测试返回正常值
        CallServerDto remotDto = CallServerDto.builder().outputPropertyA("111").build();
        Mockito.when(comcACLService.methodA(Mockito.any())).thenReturn(remotDto);
        Assertions.assertEquals("111", callServerServiceImpl.methodA(new CallServerQuery()).getOutputPropertyA());

        //2     测试抛出异常
        Mockito.when(comcACLService.methodA(Mockito.any()))
                .thenThrow(new DBusinessException("1111111","测试异常情况","RemotModel"));
        Assertions.assertThrows(DBusinessException.class,()->{
            callServerServiceImpl.methodA(new CallServerQuery());
        });
    }


}

 

 

2.2    Demo  抽象类

方案:针对抛出异常进行mock

Mock的类

package com.ddwei.test.core.chapter0.mockito;

public abstract class AbstractBeanInstance {
    public static <T> T getBeanInstance(Class<T> cla){
        return (T)ApplicationContextUtil.getBean(cla);
    }
}

 

引用的Maven Class:

package com.ddwei.test.core.chapter0.mockito;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    public static Object getBean(Class<?> classType){
        return applicationContext.getBean(classType);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

    }
}

 

Test类:

package mockito.mockito;

import com.ddwei.test.core.chapter0.mockito.AbstractBeanInstance;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MockTest9 {

    @Test
    public void getBeanInstance(){
        AbstractBeanInstance abstractBeanInstance = Mockito.mock(AbstractBeanInstance.class,Mockito.CALLS_REAL_METHODS);
        Class<MockTest9> class1 = MockTest9.class;

        Assertions.assertThrows(Exception.class,()->{
            abstractBeanInstance.getBeanInstance(class1);
        });
    }

}

 

2.3    Demo  Bean

Test类

package com.ddwei.moduleA.service.impl;

import com.ddwei.api.bff.moduleA.dto.response.CallServerDto;
import mockit.Tested;
import org.junit.Test;

public class CallServerDtoTest {

    @Tested
    CallServerDto callServerDto;

    @Test
    public void Test(){
        callServerDto = new CallServerDto();
        callServerDto = CallServerDto.builder().build();
        callServerDto = new CallServerDto("");
        callServerDto.setOutputPropertyA("");
        callServerDto.getOutputPropertyA();
    }
}

 

Bean

package com.ddwei.api.bff.moduleA.dto.response;

import lombok.*;

import java.io.Serializable;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CallServerDto implements Serializable {
    /**
     * 属性A
     */
    private String outputPropertyA;
}

 

 

 

3    Mockito  报错

3.1    java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker

设置--》file Structure-->SDKs-->对应版本添加  jdk的 tools jar包 即可

参考:

(18条消息) 记录报错 java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker_kingtok的博客-CSDN博客

 

3.2    Invalid use of argument matchers!

解决方案:将mock的时候参数要用Mockito.any() 不能直接用参数;同样,list类型用Mockito.anyList()

参考:

https://blog.csdn.net/weixin_30533797/article/details/101564648

 

3.3    Mockito Unable to acquire JDBC Connection

问题描述:本地不报错,但是上测试环境后总是报上述错误,错误原因是数据库连接部分没有mock住,但是mock住数据库连接后还是报这个错。

解决方案:因为mock测试达标80%就好,成功的已经达标了,所以把报同一类型错误的方法全部注掉了,问题解决

posted on 2022-01-15 20:33  菜鸟乙  阅读(324)  评论(0)    收藏  举报