java 单元测试_Java单元测试入门

本文介绍了Java单元测试的基础知识,包括单元测试的定义、重要性、测试分类以及Junit的使用。详细讲解了Junit的注解、断言、参数化测试、Mockito框架的应用,并提供了具体的代码示例。强调了单元测试在软件开发中的必要性和编写良好测试代码的原则。
摘要由CSDN通过智能技术生成

Java单元测试入门

什么是单元测试

定义:单元测试是对软件或程序的基本(最小)组成单元的测试

对象:方法、类

特点:

bVbcR4y?w=300&h=199

为什么要写单元测试

152345e1a006d1c1b0c9940775453c95.png

需不需要写单元测试

只要程序能运行就可以了,写单元测试浪费时间

代码很简单不需要单元测试

我保证不会有什么问题的

测试人员测试一下就可以了

这次没有时间写了,下次补上吧

测试分类

单元测试->集成测试->端到端测试

b654f467c7105723a2af77804dd176a1.png

各测试占比

16fa13c8b57e000e8c135e096e88fe67.png

Junit介绍

Junit例子

import org.junit.*;

import static org.junit.Assert.fail;

public class ClassNameTest {

@BeforeClass //公开表态无返回值

public static void beforeClass() throws Exception{

//每次测试类执行前执行一次,主要用来初使化公共资源等

}

@AfterClass //公开表态无返回值

public static void afterClass() throws Exception{

//每次测试类执行完成后执行一次,主要用来释放资源或清理工作

}

@Before

public void setup() throws Exception {

//每个测试案例执行前都会执行一次

}

@After

public void teardown() throws Exception {

//每个测试案例执行完成后都会执行一次

}

@Test

public void testMethodName_give_…_when_…_then_…() {

fail("失败");

}

}

常用注解

@Ignore

该注解标记的测试方法在测试中会被忽略

@Test

@Test(expected=xxxException.class) 断言该方法会抛出异常

@Test(timeout=1000) 执行时间超过设置的值该案例会失败

@RunWith

@RunWith(Suite.class) 测试集运行器配合使用测试集功能

@RunWith(JUnit4.class) 默认运行器

@RunWith(Parameterized.class) 参数化运行器

@RunWith(Suite.class)

@Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class})

@Rule

public class ExpectedExceptionsTest {

@Rule

public ExpectedException thrown = ExpectedException.none();

@Test

public void verifiesTypeAndMessage() {

thrown.expect(RuntimeException.class);

thrown.expectMessage("Runtime exception occurred");

throw new RuntimeException("Runtime exception occurred");

}

}

参数化

@RunWith(Parameterized.class)

public class PrimeFactorTest {

private PrimeFactor primeFactor;

private int input;

private List expected;

//构造函数

public PrimeFactorTest(int input, List expected) {

this.input = input;

this.expected = expected;

}

@Parameterized.Parameters

public static Collection init() {

return Arrays.asList(new Object[][]{

{18, Arrays.asList(2, 3, 3)}

});

}

@Test

public void testFactor_when_input_18_then_must_return_2_3_3() {

Assert.assertEquals(expected, primeFactor.factor(input));

}

}

断言

常用的断言方法如下:

assertEquals(a, b) 测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

assertFalse(a) 测试a是否为false(假),a是一个Boolean数值。

assertTrue(a)        测试a是否为true(真),a是一个Boolean数值

assertNotNull(a) 测试a是否非空,a是一个对象或者null。

assertNull(a) 测试a是否为null,a是一个对象或者null。

assertNotSame(a, b) 测试a和b是否没有都引用同一个对象。

assertSame(a, b)   测试a和b是否都引用同一个对象。

fail(string)  Fail让测试失败,并给出指定信息。

assertThat(expected, Matcher) 通过Matcher断言

Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString

建议

使用give when then方式命名你的测试方法名称。

一个案例只写一个断言。

要写注释,建议分为如下4步骤。

测试场景

准备数据

测试执行

断言

Mock介绍

一、mock就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。

Java常用Mock

EasyMock、JMock、PowerMock、Mockit等

ecf35c0a2d97e0f89154ee6317236556.png

e033f683cb71dbf747e55ae67521ee9b.png

ac00ea2d24618bb11c9a967dd5d3e8a3.png

二、Mock工具的原理

mock工具工作的原理大都如下:

record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class 或interface或method ,模拟返回的数据,及调用的次数等。

replay阶段:通过调用被测代码,执行测试。期间会invoke 到 第一阶段record的mock对象或方法。

verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。

三、Mockito使用介绍

通过代码创建

1. public class UserServiceTest {

2.     private UserService userService;

3.     private UserDao mockUserDao;

4.     @Before

5.     public void setUp() {

6.         mockUserDao = mock(UserDao.class);

7.         userService = new UserServiceImpl();

8.         userService.setUserDao(mockUserDao);

9.     }

通过注解

1. public class UserServiceTest {

2.

3.     @InjectMocks

4.     private UserServiceImpl userService;

5.

6.     @Mock

7.     private UserDao mockUserDao;

8.

9.     @Before

10.     public void setUp() {

11.         MockitoAnnotations.initMocks(this);

12.     }

四、Mockito常用方法

verify

verify(mock, never()).add("twice");  验证add方法没有被调用

verify(mock, times(2)).add("twice");  验证add方法被调用了2次

verify(mock, atLeast(n)).someMethod(); 方法至少被调用n次

verify(mock, atMost(n)).someMethod(); 方法最多被调用n次

when

when(mock.someMethod()).thenReturn(value1).thenReturn(value2);

when(mock.get(0)).thenReturn("first");

when(mock.get(1)).thenThrow(new RuntimeException());

when(mock.get(anyInt())).thenReturn("element");

spy

List spy = spy(new LinkedList());

when(spy.get(0)).thenReturn(“foo");

doReturn("foo").when(spy).get(0);

备注

假如你无法给你程序写单元测试,那么意味着你的程序结构有问题,需要调整或重构。

对待测试代码要向生产代码一样,测试代码也需要重构和维护。

3Q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值