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


@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注释一样运行它。

我如何注入myInjectedVar正确没有测试ng期望它是一个测试?

从你的类中删除@Test注释:

class MyTestClass {
    @Inject
    var myInjectedVar: MyController = _
    @Test
    def myTest = { ... }
}

参见测试文档了解详细信息:http://testng.org/doc/documentation-main.html#class-level

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

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

或者,如果您确实喜欢字段注入,则将其设置为privateprivate[this]

@Test
class X {
  @Inject
  private var myInjectedVar: MyController = _
  def myTest(): Unit = ???
}

给测试类X一个同伴会很奇怪,但是如果这样做,就有可能引入合成和访问宽度,这也会混淆测试。

最新更新