探索Java8——测试Lambda表达式

测试Lambda表达式

通常而言,好的软件工程实践一定少不了单元测试,借此保证程序的行为与预期一致。你编写测试用例,通过这些测试用例确保你代码中的每个组成部分都实现预期的结果。比如,图形应用的一个简单的Point类,可以定义如下:

public class Point{ 
 	private final int x; 
 	private final int y; 
 	private Point(int x, int y) { 
 		this.x = x; 
 		this.y = y; 
 	} 
 	public int getX() { return x; } 
  	public int getY() { return y; } 
 	public Point moveRightBy(int x){ 
 		return new Point(this.x + x, this.y); 
 	} 
} 

下面的单元测试会检查moveRightBy方法的行为是否与预期一致:

@Test 
public void testMoveRightBy() throws Exception { 
 	Point p1 = new Point(5, 5); 
 	Point p2 = p1.moveRightBy(10); 
 	assertEquals(15, p2.getX()); 
 	assertEquals(5, p2.getY()); 
} 

测试可见Lambda行为

是Lambda并无函数名(毕竟它们都是匿名函数),因此要对你代码中的Lambda函数进行测试实际上比较困难,因为你无法通过函数名的方式调用它们

有些时候,你可以借助某个字段访问Lambda函数,这种情况,你可以利用这些字段,通过
它们对封装在Lambda函数内的逻辑进行测试
。比如,我们假设你在Point类中添加了静态字段compareByXAndThenY,通过该字段,使用方法引用你可以访问Comparator对象:

public class Point{ 
 	public final static Comparator<Point> compareByXAndThenY = 
 comparing(Point::getX).thenComparing(Point::getY); 
 ...
} 


@Test 
public void testComparingTwoPoints() throws Exception { 
 	Point p1 = new Point(10, 15); 
 	Point p2 = new Point(10, 20); 
 	int result = Point.compareByXAndThenY.compare(p1 , p2); 
 	assertEquals(-1, result); 
} 

测试使用Lambda的方法的行为

但是Lambda的初衷是将一部分逻辑封装起来给另一个方法使用。从这个角度出发,你不应该将Lambda表达式声明为public,它们仅是具体的实现细节。相反,我们需要对使用Lambda表达式的方法进行测试。比如下面这个方法moveAllPointsRightBy:

public static List<Point> moveAllPointsRightBy(List<Point> points, int x){ 
 	return points.stream() 
 		.map(p -> new Point(p.getX() + x, p.getY())) 
 		.collect(toList()); 
} 

我们没必要对Lambda表达式p -> new Point(p.getX() + x,p.getY())进行测试,它只是moveAllPointsRightBy内部的实现细节。我们更应该关注的是方法moveAllPointsRightBy的行为:

@Test 
public void testMoveAllPointsRightBy() throws Exception{ 
 	List<Point> points = 
 Arrays.asList(new Point(5, 5), new Point(10, 5)); 
 	List<Point> expectedPoints = 
 Arrays.asList(new Point(15, 5), new Point(20, 5)); 
 	List<Point> newPoints = Point.moveAllPointsRightBy(points, 10); 
 	assertEquals(expectedPoints, newPoints); 
} 

调试

调试一般是使用:

  • 查看栈跟踪
  • 输出日志
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值