如何用JUnit单元测试List

问题

JUnit测试List时差强人意。

解法

引入依赖

hamcrest-library包含许多有用方法来测试List数据类型。

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<scope>test</scope>
		<exclusions>
			<exclusion>
				<groupId>org.hamcrest</groupId>
				<artifactId>hamcrest-core</artifactId>
			</exclusion>
		</exclusions>
	</dependency>

	<!-- This will get hamcrest-core automatically -->
	<dependency>
		<groupId>org.hamcrest</groupId>
		<artifactId>hamcrest-library</artifactId>
		<version>1.3</version>
		<scope>test</scope>
	</dependency>
	...

断言含有String的List

查阅org.hamcrest.collection包,它包含许多有用方法来测试CollectionList

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.hamcrest.collection.IsEmptyCollection;

import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
import static org.hamcrest.MatcherAssert.assertThat;

public class StringListTest {

	@Test
	public void test() {

		List<String> actual = Arrays.asList("a", "b", "c");
		List<String> expected = Arrays.asList("a", "b", "c");

		// All passed / true

		// 1. Test equal.
		assertThat(actual, is(expected));

		// 2. If List has this value?
		assertThat(actual, hasItems("b"));

		// 3. Check List Size
		assertThat(actual, hasSize(3));

		assertThat(actual.size(), is(3));

		// 4. List order

		// Ensure Correct order
		assertThat(actual, contains("a", "b", "c"));

		// Can be any order
		assertThat(actual, containsInAnyOrder("c", "b", "a"));

		// 5. check empty list
		assertThat(actual, not(IsEmptyCollection.empty()));

		assertThat(new ArrayList<>(), IsEmptyCollection.empty());

	}
}

断言含有Integer的List

查阅org.hamcrest.number包,它包含许多有用方法来测试数目。

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.hamcrest.collection.IsEmptyCollection;

import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;

import static org.hamcrest.number.OrderingComparison.greaterThanOrEqualTo;
import static org.hamcrest.number.OrderingComparison.lessThan;

import static org.hamcrest.MatcherAssert.assertThat;

public class IntegerListTest {

	@Test
	public void test() {
		List<Integer> actual = Arrays.asList(1, 2, 3, 4, 5);
		List<Integer> expected = Arrays.asList(1, 2, 3, 4, 5);

		// All passed / true

		// 1. Test equal.
		assertThat(actual, is(expected));

		// 2. Check List has this value
		assertThat(actual, hasItems(2));

		// 3. Check List Size
		assertThat(actual, hasSize(5));

		assertThat(actual.size(), is(5));

		// 4. List order

		// Ensure Correct order
		assertThat(actual, contains(1, 2, 3, 4, 5));

		// Can be any order
		assertThat(actual, containsInAnyOrder(5, 4, 3, 2, 1));

		// 5. check empty list
		assertThat(actual, not(IsEmptyCollection.empty()));
		assertThat(new ArrayList<>(), IsEmptyCollection.empty());

		// 6. Test numeric comparisons
		assertThat(actual, everyItem(greaterThanOrEqualTo(1)));
		assertThat(actual, everyItem(lessThan(10)));
	}

}

Note
Both org.hamcrest.collection and org.hamcrest.number are belong to hamcrest-library

断言含有Object的List

一个POJO类:

import java.util.Objects;

public class Fruit {
	
	public Fruit(String name, int qty) {
		this.name = name;
		this.qty = qty;
	}

	private String name;
	private int qty;

	public int getQty() {
		return qty;
	}

	public void setQty(int qty) {
		this.qty = qty;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// Test equal, override equals() and hashCode()
	@Override
	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;
		Fruit fruit = (Fruit) o;
		return qty == fruit.qty && Objects.equals(name, fruit.name);
	}

	@Override
	public int hashCode() {
		return Objects.hash(name, qty);
	}
}


测试类:

import org.junit.Test;

import java.util.Arrays;
import java.util.List;

import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;

public class ObjectListTest {
	
	@Test
	@SuppressWarnings("unchecked")
	public void test() {

		List<Fruit> list = Arrays.asList(new Fruit("Banana", 99), 
				new Fruit("Apple", 20));

		// Test equals
		assertThat(list, hasItems(new Fruit("Banana", 99), //
				new Fruit("Apple", 20)));

		assertThat(list, containsInAnyOrder(new Fruit("Apple", 20), // 
				new Fruit("Banana", 99)));

		// Test class property, and its value
		assertThat(list, containsInAnyOrder(hasProperty("name", is("Apple")), 
				hasProperty("name", is("Banana"))));

	}
}

参考

  1. JUnit – How to test a List
  2. Hamcrest official site
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值