当前位置: 首页 > 知识库问答 >
问题:

Scala--有没有一种方法可以模拟trait,通过同伴对象进行扩展?

白腾
2023-03-14
trait A{
 def getSomething(arg1)
}

class B(field1)....

object B extends A{
 def apply(arg1) = new B(getSomething(arg1))
}

代码工作得很好,但在测试代码时出现了问题。单元测试应该是独立的,因此我应该以某种方式模拟/存根trait a:

val fakeA = stub[A]    
(fakeA.getSomething _).when(arg).returns(res)

现在...我应该如何在单元测试中使用这个被嘲弄的特性呢?模拟创建了一个对象(而不是一个类型),使用这样的代码,我无法将其“传递”给我的对象(或使用)。我如何才能实现我的目标(在我的B对象中存根/模拟getSomething())?我尝试将对象B拆分为Blogic和B扩展Blogic。但那又怎样呢?

共有1个答案

萧麒
2023-03-14

对象是表示“世界末日”的单例实例。它们不能被继承,也不能被嘲弄(没有黑客)或其他任何东西。您有以下选项:

  1. 直接测试您的对象,即调用B.apply(...)测试结果到您的预期结果。
  2. 将对象功能提取到traits/classes,并让它将所有功能混合在一起

第二种解决方案示例

trait A{
  def getSomething(arg1: Int): Int = ???
}

trait BFactoryUsingA { self: A => // This says that it needs/requires A
  def apply(arg1: Int) = new B(getSomething(arg1))
}

class B(field1: Int) {}

object B extends BFactoryUsingA with A {
  // No methods or those which have nothing to do with traits A and BFactoryUsingA hierarchy and composition
}
// Instance as anonymous mixin of traits containing logic
val instanceUnderTest = new BFactoryUnsingA with A { }

希望有帮助

 类似资料:
  • 问题内容: 现在我正在做: 有没有更有效的方法直接从Find(或其他搜索功能)中获取带有用户名的slice,而没有struct和range循环? 问题答案: MongoDB的结果始终是文档列表。因此,如果要获取值列表,则必须像以前一样手动将其转换。 使用自定义类型(源自) 另外请注意,如果您要创建自己的类型(从派生),则可以覆盖其取消编组逻辑,并仅从文档中“提取” 。 它看起来像这样: 然后将用户

  • 问题内容: 我有一个.csv文件,如下所示: 我必须从文件中删除重复的电子邮件(整行)(即,上面示例中包含的行之一)。如何仅在字段1(用逗号分隔)上使用?根据,没有列选项。 我尝试了一些东西,但是没有用。 问题答案: 为了独特 所以逗号是定界符 对于关键字段1 测试结果:

  • 问题内容: 如果输入大小太小,则库会自动序列化 流中地图的执行,但是这种自动化不会并且也不会考虑地图操作的繁重程度。有没有办法 强制parallelStream()实际并行化CPU重映射? 问题答案: 似乎存在根本的误解。链接的“问答”讨论了由于OP没有 看到预期的加速,流显然不能并行工作。结论是,有没有好处在 并行处理工作负载是否太小,不,有一个自动回退到顺序执行。 实际上是相反的。如果您请求并

  • 问题内容: 我希望能够在一个程序包中编写一个Java类,该程序包可以访问另一个程序包中某个类的非公共方法,而不必使其成为另一个类的子类。这可能吗? 问题答案: 这是我在JAVA中用来复制朋友机制的一个小技巧。 可以说我有一节课和另外一节课。由于仇恨原因,他们处于不同的包裹(家庭)中。 想要并且只想让她。 在中,将声明Romeo为(情人),friend但是在Java中没有这样的东西。 这是类和技巧:

  • 我面临的错误是java.lang.IllegalArgumentException:Java8日期/时间类型默认情况下不支持:添加模块com.fasterxml.jackson.datatype: jackson-datatype-jsr310启用处理,要解决这个问题,我已经包含了上面提到的依赖项,并且还在对象映射器中进行了更改以注册(新的javaTimeModule()),它在进行一些更改后正在

  • 问题内容: 我正在使用GhostDriver的Java绑定对PhantomJS运行Selenium接受测试。 如果PhantomJS请求的网页之一通过console.log登录到Javascript控制台,是否可以捕获或查看这些消息? 我想这的答案很简单,但我无法解决! 问题答案: