Scala中的函数编程:如何对函数组合进行单元测试

时间:2017-06-21 20:31:06

标签: scala functional-programming

我正在阅读这本书" Scala中的功能编程"我正在编写单元测试来检查练习的实现。

我不确定我理解的是如何使用函数组合和状态通过进行单元测试练习,本书第6章对此进行了解释。

例如,一个练习(本书的6.8)与使用状态通道的函数 flatMap 的实现有关,在解决方案下面:

def flatMap[A, B](f: Rand[A])(g: A => Rand[B]): Rand[B] = {
  rng => {
    val (a, rng2) = f(rng)
    g(a)(rng2)
  }
}

现在,我确实理解了解决方案的实现,但我无法弄清楚如何为它编写单元测试。 详细地说,我理解如何将Rand [A]作为函数 f 的参数,但我不知道如何构建函数 g ,这应该是返回兰德[B]。

有人想出一个解决方案吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果你想实现一个 @RunWith(Arquillian.class) public class LoginSeviceTest { // a pattern I find quite neat: hold the mocks in a static local class, but they might be anywhere else public static class LocalMocks { @Produces public static UserDAO mockUser = Mockito.mock(UserDAO.class); } @Deployment public static WebArchive createDeployment() { PomEquippedResolveStage pom = Maven.resolver().loadPomFromFile("pom.xml"); BeansDescriptor beansXml = Descriptors.create(BeansDescriptor.class) .addDefaultNamespaces().getOrCreateAlternatives() .up(); WebArchive jar = ShrinkWrap.create(WebArchive.class) .addAsLibraries(pom.resolve("org.mockito:mockito-core").withTransitivity().asFile()) .addClass(LoginService.class) // eventually further classes or packages you depend on .addClass(LoginSeviceTest.LocalMocks.class) .addAsWebInfResource(new StringAsset(beansXml.exportAsString()), "beans.xml"); return jar; } @Inject LoginService loginService; @Test public void testLogin() { // use the injected loginService here for actual tests } } 函数A => Rand[B]并返回A,你只需要

  1. 创建Rand[B]的方法(将其定义为Rand[B]的别名)。您可以明确地执行此操作(通过创建RNG => (B,RNG)并定义函数),也可以使用返回RNG的其他函数(例如Rand[B]unit,... )。
  2. map

    生成B的逻辑
    A