使用@Inject注释会导致var被识别为@Test?

时间:2014-08-18 21:51:44

标签: scala testing intellij-idea dependency-injection testng

@Test
class MyTestClass {

  @Inject
  var myInjectedVar: MyController = _

  @Test
  def myTest = { ... }
}

当我使用IntelliJ,javax和TestNG来运行MyTestClass中的所有测试时,myTest会按照我的预期运行,但我的输出还显示了一个无法正常运行的其他测试:

org.testng.TestNGException: 
Method myInjectedVar_$eq requires 1 parameters but 0 were supplied in the @Test annotation.

不知何故,上面的@Inject注释似乎正在创建一个名为myInjectedVar_$eq的方法,然后TestNG希望能够像使用@Test注释一样运行它。

如果没有TestNG期望它成为测试,我如何正确地注入myInjectedVar

2 个答案:

答案 0 :(得分:2)

从班级中删除@Test注释:

class MyTestClass {
    @Inject
    var myInjectedVar: MyController = _

    @Test
    def myTest = { ... }
}

有关详细信息,请参阅testng文档:http://testng.org/doc/documentation-main.html#class-level

  

类级@Test注释的作用是使该类的所有公共方法成为测试方法,即使它们没有注释。如果要添加某些属性,仍可以在方法上重复@Test注释。

方法myInjectedVar_=(v: MyController): UnitmyInjectedVar(): MyController是scala编译器生成的方法。 Scala使用这些方法来访问var。

答案 1 :(得分:0)

或者,如果您真的更喜欢现场注入,请将其设为privateprivate[this]

@Test
class X {

  @Inject
  private var myInjectedVar: MyController = _

  def myTest(): Unit = ???
}

将测试类X作为伴侣是很奇怪的,但是如果你这样做,你就冒险引入合成和访问扩展,这也会混淆testng。