hel*_*hod 92 java junit scala scalatest
我正在尝试将ScalaTest合并到我的Java项目中; 用ScalaTests替换所有JUnit测试.有一次,我想检查Guice的Injector是否注入了正确的类型.在Java中,我有一个这样的测试:
public class InjectorBehaviour {
@Test
public void shouldInjectCorrectTypes() {
Injector injector = Guice.createInjector(new ModuleImpl());
House house = injector.getInstance(House.class);
assertTrue(house.door() instanceof WoodenDoor);
assertTrue(house.window() instanceof BambooWindow);
assertTrue(house.roof() instanceof SlateRoof);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我在使用ScalaTest时遇到了同样的问题:
class InjectorSpec extends Spec {
describe("An injector") {
it("should inject the correct types") {
val injector = Guice.createInjector(new ModuleImpl)
val house = injector.getInstance(classOf[House])
assert(house.door instanceof WoodenDoor)
assert(house.window instanceof BambooWindow)
assert(house.roof instanceof SlateRoof)
}
}
}
Run Code Online (Sandbox Code Playgroud)
它抱怨说,价值instanceof
是不是成员Door
/ Window
/ Roof
.我不能instanceof
在Scala中使用这种方式吗?
agi*_*eel 112
Scala不是Java.Scala只是没有运算符,instanceof
而是有一个名为的参数方法isInstanceOf[Type]
.
您可能还喜欢观看ScalaTest速成课程.
mar*_*n-g 74
使用Scalatest 2.2.x(甚至可能更早),您可以使用:
anInstance mustBe a[SomeClass]
Run Code Online (Sandbox Code Playgroud)
Gui*_*ose 30
如果你想减少JUnit-esque,如果你想使用ScalaTest的匹配器,你可以编写自己的匹配类型(bar类型擦除)的属性匹配器.
我发现这个帖子非常有用:http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea
然后你可以编写如下的断言:
house.door should be (anInstanceOf[WoodenDoor])
Run Code Online (Sandbox Code Playgroud)
代替
assert(house.door instanceof WoodenDoor)
Run Code Online (Sandbox Code Playgroud)
小智 15
关于isInstanceOf [Type]和junit建议的当前答案是好的,但我想添加一件事(对于以非junit相关容量到达此页面的人).在许多情况下,scala模式匹配将满足您的需求.我会在这些情况下推荐它,因为它为您提供免费的类型转换,并留下更少的错误空间.
例:
OuterType foo = blah
foo match {
case subFoo : SubType => {
subFoo.thingSubTypeDoes // no need to cast, use match variable
}
case subFoo => {
// fallthrough code
}
}
Run Code Online (Sandbox Code Playgroud)