工作记录------单元测试(持续更新)

工作记录------单元测试

之前的工作中从来没有写过单元测试,新入职公司要求写单元测试,

个人觉得,作为程序员单元测试还是必须会写的

于此记录一下首次编写单元测试的过程。

首先引入单元测试相关的依赖

bash 复制代码
       <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

其次创建test目录

在src目录下,创建与main同级的目录。

其中test/java目录下编写测试类

test/resources目录下放置测试所需要的配置文件。

test/java与main/java目录层级结构保持一致。

区别在于测试类以Test结尾。

测试类编写

bash 复制代码
@RunWith(MockitoJUnitRunner.class)
public class ATest {
    private static final Logger LOGGER = LoggerFactory.getLogger(A.class);

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Mock
    private D d;

    @Mock
    private E e;

    @Mock
    private F f;

    private H h = new H();

    @Test
    public void testGetType() {
        Enum type = a.getType();
        boolean equals = type.equals(Enum.SAVE);
        Mockito.when(d.d(Mockito.anyString(), Mockito.any(), Mockito.any())).thenReturn("123456789");
        AppLogUtil.info(LOGGER, "Enum.SAVE result:{}", equals);
    }

	@Before
    public void init() {
        MockitoAnnotations.initMocks(this);
        f.setB("aaa");
    }

首先在文件头声明这是一个测试类:@RunWith(MockitoJUnitRunner.class)

这是一个A类的测试类,所以文件名为ATest。
@InjectMocks

作用是:注入mock

意味着在测试过程中进入A类时,A类中所涉及的引用都是有值的,不为null,指的是A类中的(B-F)。
@Mock:

就是模拟这个引用的依赖,用于Test类
@Before

执行@Test方法前,先执行的步骤,一般用于参数构建,以及mock注入:MockitoAnnotations.initMocks(this);这句话与@InjectMocks相结合使用,表明注入模拟A类。
@Test :

指的是拥有这个注解的方法就是测试方法,通过这个方法对A类中的具体方法进行测试,而方法名一般为"test方法名"。需要传递参数的话,就需要先构建对应的参数。

而由于A类中涉及到了很多依赖的调用,此时我们也需要mock返回参数,使得流程能正常的跑下去。
由此能够看出,单元测试只针对当前一个方法的逻辑,不会延伸到引用调用的方法。

当遇到其他引用的方法调用时,也需要mock,比如执行到D类的d方法,就需要Mockito.when(d.d(Mockito.anyString(), Mockito.any(), Mockito.any())).thenReturn("123456789");根据这个语句能够看出,d方法需要三个参数,该方法需要几个参数,就传入几个参数。thenReturn代表模拟的返回值。

问题:如果在A类中,调用B引用的select方法,两次,一次返回null,一次返回有值,应该怎么操作?

答案:

Mockito.when(B.select(Mockito.anyString())).thenReturn(null).thenReturn(dto);

通过两次thenReturn方法,第一次则会返回第一次thenReturn的结果,第二次会返回第二次thenReturn的结果

此时dto需要自行new

相关推荐
汽车仪器仪表相关领域16 小时前
Debron OVM 1052 光学关门速度仪:汽车门盖检测的高精度便携工具 + 生产线适配 + 耐久性监测,整车制造与质量控制的黄金标准
人工智能·功能测试·单元测试·汽车·制造·可用性测试
Sandy_Star1 天前
1.9 民法典及社会保险法制度规定
单元测试
Sandy_Star2 天前
1.7 税务行政法律救济
大数据·单元测试
zlpzlpzyd2 天前
slf4j中jcl-over-slf4j、jul-to-slf4j、log4j-over-slf4j、slf4j-api的区别是什么
java·开发语言·log4j
Kiyra2 天前
Query Rewrite 不是越智能越好:RAG 检索的精确词保护与动态召回
redis·websocket·junit·单元测试·json
计算机安禾3 天前
【c++面向对象编程】第9篇:友元(friend):破坏封装的“特权”——真的有害吗?
java·c++·log4j
华万通信king3 天前
腾讯会议API集成测试实战:从单元测试到端到端自动化
单元测试·自动化·腾讯会议
姚青&3 天前
常用的测试平台
单元测试
代码漫谈4 天前
Spring Boot日志配置全攻略:打造高效、可靠的日志系统
java·spring boot·log4j·日志
ideal-cs4 天前
总结:生产环境Logback日志配置模板与pattern格式案例
java·log4j·logback·pattern·后端日志