当前位置:网站首页>基于Junit4的单元测试

基于Junit4的单元测试

2022-06-10 11:03:00 andQVQ

测试类基本思路

  1. mock中引入测试类。
  2. 初始化类中的对象和引用类,建立映射关系。
  3. 构建需要测试的数据和请求,测试功能是否运行正确。

测试顺序

@Test:这个注释说明依附在 JUnitpublic void 方法可以作为一个测试案例。
@Before:有些测试在运行前需要创造几个相似的对象。在 public void 方法加该注释是因为该方法需要在 test 方法前运行。
@After:如果你将外部资源在 Before 方法中分配,那么你需要在测试运行后释放他们。在 public void 方法加该注释是因为该方法需要在 test 方法后运行。
@BeforeClass:public void 方法加该注释是因为该方法需要在类中所有方法前运行。
@AfterClass:它将会使方法在所有测试结束后执行。这个可以用来进行清理活动。
@Ignore:这个注释是用来忽略有关不需要执行的测试的。

在 before() 方法和 after() 方法之间,执行每一个测试用例。

@RunWith(SpringRunner.class)

测试类的初始化。在测试类的开头标注,表明运行环境,例如启动和创建spring的应用上下文。否则你需要为此在启动时写一堆的环境配置代码。

@Mock:

在单元测试中,我们往往想去独立地去测一个类中的某个方法,但是这个类可不是独立的,它会去调用一些其它类的方法和service,这也就导致了以下两个问题:

  • 外部服务可能无法在单元测试的环境中正常工作,因为它们可能需要访问数据库或者调用其它Http服务。
  • 我们的测试关注点在于这个类的实现上,外部类的一些行为可能会影响到我们对本类的测试,那也就失去了我们进行单测的意义。
    在Mockito中用于创建mock对象,使用方法如下:
@Mock
private ClassName mockedObject;

上面代码创建了一个名为mockedObject,类型为ClassName的mock对象,该对象所有的方法被置空,根据测试代码逻辑的需要使用

MockitoAnnotations.initMocks(this);

让@Nock注解生效

Mock方法的默认值

Mock对象的方法未设置测试桩时,Mockito会返回方法返回类型的默认值,不会报错。mock 实例默认的会给所有的方法添加基本实现:返回 null 或空集合,或者 0 等基本类型的值。这取决于方法返回类型

List mockList = mock(List.class);
when(mockList.get(5)).thenReturn("hello");//打桩
Assert.assertEquals("hello", mockList.get(5));//打桩的情景返回设定值
Assert.assertEquals(null, mockList.get(10));//未打桩的情景不会报错,返回默认值

参数匹配器(matchers)

属于状态测试
是一些静态方法,说白了就是mock方法成立的一些条件
列举几个典型匹配器:

any() : 任何参数
any(OrderInfo.class): 任何OrderInfo(开发中自定义的类)
anyString() :任何字符串,等同于any(String.class)
eq(1): 具体值1

InvokeService类中,要被mock的方法


public Integer targetMethod01(String param01, Integer param02) {
    
    return 1;
}

测试类TargetClassTest中:

@Mock
private InvokeService mockService;

@Test
public void dmeoTest() {
    
    Mockito.when(mockService.targetMethod01(any(), any())).thenReturn(666);
    Mockito.when(mockService.targetMethod01(any(String.class), anyInt())).thenReturn(666);
    Mockito.when(mockService.targetMethod01("demo", 1)).thenReturn(666);
    Mockito.when(mockService.targetMethod01(eq("demo"), eq(1))).thenReturn(666);
    //上面都是正确的,下面的写法,单测执行时会报错
    Mockito.when(mockService.targetMethod01(eq("demo"), 1)).thenReturn(666);
}

一旦使用了参数匹配器来验证,那么所有参数都应该使用参数匹配

行为测试

某些时候,测试不关心返回结果,而是侧重方法有否被正确的参数调用过。从概念上讲,就是和状态测试所不同的“行为测试”了。
一旦使用 mock() 或@Mock生成模拟对象,意味着 Mockito 会记录着这个模拟对象调用了什么方法,还有调用了多少次、调用的顺序等。最后由用户决定是否需要进行验证。

times(x):mock方法被调用x次
never():从未被调用过,等价于times(0)
atLeast(x):至少调用过x次
atLeastOnce():至少调用过1次,等价于atLeast(1)
atMost(x):最多调用过x次
verify():内部跟踪了所有的方法调用和参数的调用情况,然后会返回一个结果,说明是否通过。也可以像 when 那样使用参数匹配器。

field

判断类中是否包含某个字段

RefelctionUtils.findFiled(class, name);

使 filed 变为可访问

ReflectionUtils.makeAccessible(field); 

直接设置对象属性值

ReflectionUtils.setFiled(Field field, Object target, Object value);

Assert

assert意为断言的意思,这个关键字可以判断布尔值的结果是否和预期的一样,如果一样就正常执行,否则会抛出AssertionError。

void assertEquals(boolean expected, boolean actual):检查两个变量或者等式是否平衡
void assertTrue(boolean expected, boolean actual):检查条件为真
void assertFalse(boolean condition):检查条件为假
void assertNotNull(Object object):检查对象不为空
void assertNull(Object object):检查对象为空
void assertSame(boolean condition):assertSame() 方法检查两个相关对象是否指向同一个对象
void assertNotSame(boolean condition):assertNotSame() 方法检查两个相关对象是否不指向同一个对象
void assertArrayEquals(expectedArray, resultArray):assertArrayEquals() 方法检查两个数组是否相等

JUnit 时间测试

如果一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout参数和 @Test 注释一起使用。是不是很强大?

@Test(timeout=1000)

JUnit 参数化测试

Junit 4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。你将遵循 5 个步骤来创建参数化测试。

  1. 用 @RunWith(Parameterized.class) 来注释 test 类。
  2. 创建一个由 @Parameters注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
  3. 创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
  4. 为每一列测试数据创建一个实例变量。
  5. 用实例变量作为测试数据的来源来创建你的测试用例。

一旦每一行数据出现测试用例将被调用。

参考1
参考2
参考3
参考4

原网站

版权声明
本文为[andQVQ]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_40776361/article/details/125060588