排除ScalaTest(maven)中的特定测试子类

排除ScalaTest(maven)中的特定测试子类,scala,maven,scalatest,Scala,Maven,Scalatest,我有一个带有WordSpecLike的超类,每个后端有几个子类 abstract class A extends TestKit(_system) with WordSpecLike { "backend" must { "do something useful" in { //test useful stuff } "print something pretty" in { //test

我有一个带有WordSpecLike的超类,每个后端有几个子类

abstract class A  extends TestKit(_system) with WordSpecLike {
    "backend" must {
        "do something useful" in {
            //test useful stuff
         }
        "print something pretty" in {
           //test pretty print
        }
    }    
}

class B extends A {

}

class C extends A {

}
C和B测试不同的后端,但问题是我需要为集成测试分别打开/关闭每个后端测试(使用排除组)。 显然,我不能用taggedAs。 在下面的例子中使用一个单独的特征是不可行的:

    trait backendB { this: Tag => 
        override val name = "backendB"
    }

    class B extends A with backendB {
    //...
    }

}
纯java注释不起作用:

@TagAnnotation 
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface backendB { 
}
因此,问题是:我是否有其他选项可以在特殊组下运行每个后端测试,或者我必须复制粘贴代码?

Scala版本2.10

ScalaTest版本2.2.2

Java版本1.8.0_20


不能使用sbt代替maven,不能使用scala版本。

如果我理解正确,您有时希望排除类B,只运行类C。其他时候排除类C,只运行类B。如果正确,则通常使用相应的标记注释(使用Java进行注释)。例如,这样做会导致B的所有测试都标记为backendB:

@backendB
class B extends A {
}
你没有展示演员系统的来源。关于标记的一点是,它只排除测试,仍然会创建一个B的实例。这意味着它持有的任何状态都将被初始化,在您的情况下,这可能意味着一个参与者系统。这可能就是你所说的“没有工作”的意思。如果是这样,我通常的建议是将该状态惰性地初始化。实例仍将被创建,但由于没有运行任何测试,因此状态将永远不会被访问,并且由于它是惰性的,因此将永远不会被初始化


由于这个回复中有很多未知因素,您可能会在scalatest用户上做得更好,因为在scalatest用户上来回比较容易。

好的,我的最终解决方案并不像它可能的那么优雅,但至少它是可行的(还是一种java方式的解决方案)

几个小变化:

trait A-suite extends WordSpecLike {
   val tagToExclude = Tag("here we can write anything")

   def createTestBackend: Backend

   "backend" must {

     "do something useful" taggedAs(tagToExclude) in {
        val backend = createTestBackend
        //test useful stuff
     }

    "print something pretty" taggedAs(tagToExclude) in {
        val backend = createTestBackend
       //test pretty print
    }

   }    
}
和不同后端的测试类:

`


现在排除组可以与maven正常工作。

谢谢您的回答。是的,您理解正确,但由于某些原因,整个类的注释不起作用-maven只运行它能找到的每个类。
class backendA(override val tagToExclude = "backendA") extends A-suite {
      override def createTestBackend: Backend = new backendA 
   }  

class backendB(override val tagToExclude = "backendB") extends A-suite {
      override def createTestBackend: Backend = new backendB
   }