【问题标题】:Java 8: unit-testing a method that returns a Function objectJava 8:对返回 Function 对象的方法进行单元测试
【发布时间】:2018-11-29 13:49:41
【问题描述】:

我正在尝试为返回 Function 的方法编写 Java 8 单元测试;类似:

class MyObject<X> {
     public Function<X,Obj> getFunction() {...}
 }

在我的单元测试中,我创建了一个示例对象并调用getFunction(),并希望将其与不适用于org.junit.Assert.assertEquals 的预期函数进行比较:

@Test
public void getFunction_returnsFunction() {
   final MyObject<St> object = new MyObject<>(..);
   final Function<St,Obj> expectedResult = ...;

   // this does not work
   assertEquals(expectedResult, object.getFunction());
}

甚至可以比较两个Functions 吗?您建议如何对这种方法进行单元测试?

【问题讨论】:

  • 你想对它进行什么单元测试?例如:它没有异常地工作,它返回非空值,它返回一个当你传入 Y 时产生 X 的函数...?
  • 我想测试它是否返回了正确的函数。
  • 但是什么是“正确的功能”?当然,您可以测试它是否返回特定实例或特定类的实例,但您只是在复制您的实现。
  • 返回的Function 取决于MyObject 的某些成员,我想测试返回的Function 是否与我期望的MyObject 对象的函数相对应。
  • 如果函数应该相同,您可以测试assertTrue(expected == object.getFunction());,但如前所述,这似乎是一种循环(只需执行任何操作以获取expected getFunction 本身?)。

标签: java unit-testing lambda java-8


【解决方案1】:

使用标准R Function.apply(T t)方法检查函数行为:

Function<St,Obj> func = o.getFunction();
assertEquals(func.apply(value), expectedFunctionResult);

【讨论】:

  • 但据我所知,这种方式我只能测试某些输入值的函数,但不能保证函数对于 所有 可能的输入都是正确的。跨度>
  • @AndreaRendl-Pitrey 这与对常规方法进行单元测试并没有什么不同:您传入一些已知的输入,然后检查输出是否符合您的预期。您可以选择这些输入,以便它们测试显着行为,例如边界。
  • 好的,我明白你的意思了。我想没有比使用Function.apply(T t) 更好的方法来测试结果了。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2014-05-10
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
相关资源
最近更新 更多