探索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); 
} 

调试

调试一般是使用:

  • 查看栈跟踪
  • 输出日志
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Stream和Lambda表达式Java 8引入的重要特性。Stream是Java中用于操作集合的一种新方式,可以方便地对集合进行过滤、映射、排序等操作。而Lambda表达式则是一种简洁的函数式编程的方式,可以将代码作为数据进行传递和处理。 在使用Stream和Lambda表达式时,可以通过filter方法来排除某些元素。例如,可以使用filter((e) -> e.getAge() > 2)来筛选出年龄大于2的员工。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java8新特性详解](https://blog.csdn.net/qq_36144703/article/details/109094750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java新特性:Stream流和Lambda表达式](https://blog.csdn.net/m0_63411861/article/details/130667884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java——Lambda&Stream表达式](https://blog.csdn.net/xinin919/article/details/126629924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值