2015-08-22 19 views
7

TemporaryFolder gibi JUnit kurallarını veya şirket içinde zaten geliştirdiğimiz TestRule gibi JUnit kurallarını kullanmak isterim. Bunu gerçekleştirmenin en iyi yolu nedir? Ben JUnitSuite farkındayım ama @Rule ek açıklama almak için görünmüyor. Yine de farklı bir ScalaTest paketi kullanmak istiyorum.ScalaTest ile JUnit @Rule kullanma (ör. TemporaryFolder)

Yani benim sorular şunlardır:

  • JUnit kurallar ScalaTest takım tarafından desteklenir mi?
  • Değilse,n numaralı telefonu kullanarak bir kütüphane var mı?
  • Değilse, JUnit TestRule s Scala testlerinde nasıl kullanılır? Ya da TemporaryFolder'un ya da örneğin, Stefan Birkner'ın System Rules'un ne sağladığını anlamak için daha uygun bir Scala'ya özgü yaklaşım var mıdır?

İşte JUnitSuite ile çalıştı budur:

İşte
class MyTest extends JUnitSuite { 
    //@Rule 
    //val temporaryFolder = new TemporaryFolder() // throws java.lang.Exception: The @Rule 'temporaryFolder' must be public. 

    @Rule 
    def temporaryFolder = new TemporaryFolder() 

    @Test 
    def test: Unit = { 
    assert(temporaryFolder.newFile() !== null) // java.lang.IllegalStateException: the temporary folder has not yet been created 
    } 
} 

cevap

8

TemporaryFolder türünde bir üye alanı oluşturarak ve bu alan değerini @Rule işleviyle döndürerek sorunu çözebilirsiniz.

class MyTest extends JUnitSuite { 

    val _temporaryFolder = new TemporaryFolder 

    @Rule 
    def temporaryFolder = _temporaryFolder 

    @Test 
    def test: Unit = { 
    assert(temporaryFolder.newFile() !== null) 
    } 
} 
+0

Ah, teşekkürler, için uygulanacaktır. Birden çok 'TemporaryFolder' örneğinin oluşturulmamış kopyası. Sonunda, JUnitSuite ile kilitlenmemesi için istiflenebilir karışıma çözümüyle gittik. Ama neyse, bil ki '@ Rule'' scalatest’te desteklenebilir. – Mifeet

+0

Yardım edebildiğime sevindim :-) –

8

Ben ScalaTest en documentation on fixtures dayalı geldi budur. Yine de, daha iyi bir çözüm olup olmadığını bilmek istiyorum.

  1. Kredi-fikstürü yöntemi Artıları

    class LoanFixtureTest extends FunSuite { 
        def withRule[T <: TestRule](rule: T)(testCode: T => Any): Unit = { 
        rule(
         new Statement() { 
         override def evaluate(): Unit = testCode(rule) 
         }, 
         Description.createSuiteDescription("JUnit rule wrapper") 
        ).evaluate() 
        } 
    
        test("my test") { 
        withRule(new TemporaryFolder()) { temporaryFolder => 
         assert(temporaryFolder.newFile() !== null) 
        } 
        } 
    } 
    
    • : sadece
    • Eksileri tabi testlere kuralı uygulayarak sağlar: çok şık değil kullanımı; Birden TestRules withFixture(test: NoArgTest) geçersiz kılma

      trait TemporaryFolderFixture1 extends SuiteMixin { 
          this: Suite => 
          val temporaryFolder = new TemporaryFolder 
      
          abstract override def withFixture(test: NoArgTest) = { 
          var outcome: Outcome = null 
          val statementBody =() => outcome = super.withFixture(test) 
          temporaryFolder(
           new Statement() { 
           override def evaluate(): Unit = statementBody() 
           }, 
           Description.createSuiteDescription("JUnit rule wrapper") 
          ).evaluate() 
          outcome 
          } 
      } 
      
      class StackableTraitFixtureTest extends FunSuite with TemporaryFolderFixture1 { 
          test("my test") { 
          assert(temporaryFolder.newFile() !== null) 
          } 
      } 
      
      • Avantaj ile istiflenebilir katmalar kullanarak
    • gereklidir hantal olduğunda: çok basit bir kullanımı, uygun

    • Tük birden çok kural karıştırma sağlar: gerektiren bir mixin sahip her kural; İhtiyacı olmayan testler için bile kuralların uygulanması gerekir; kural kullanılamaz örn. ekstra bir çaba
gerektirecektir yerine TestRule herhangi kuralıyla birlikte çalışacak jenerik yapma, tek TestRule sağlar: BeforeAfterEach#beforeEach() yılında
  • withFixture(test: OneArgTest)

    trait TemporaryFolderFixture2 { 
        thisFixture: org.scalatest.fixture.FunSuite => 
        type FixtureParam = TemporaryFolder 
    
        override protected def withFixture(test: OneArgTest): Outcome = { 
        val temporaryFolder = new TemporaryFolder() 
        var outcome: Outcome = null 
        temporaryFolder(
         new Statement() { 
         override def evaluate(): Unit = { 
          outcome = withFixture(test.toNoArgTest(temporaryFolder)) 
         } 
         }, 
         Description.createSuiteDescription("JUnit rule wrapper") 
        ).evaluate() 
        outcome 
        } 
    } 
    
    class OneArgWithFixtureTest extends org.scalatest.fixture.FunSuite with TemporaryFolderFixture2 { 
        test("my test") { temporaryFolder => 
        assert(temporaryFolder.newFile() !== null) 
        } 
    } 
    
    • Eksileri geçersiz kılma

      Hangisini en çok seviyorsunuz?

  • 1

    Bu, benim için çalıştı. answer dayanarak. Yani açıklama :) çalışır (sentetik) alıcı yöntemine

    import org.junit._ 
    import scala.annotation.meta.getter 
    
    class MyTest extends JUnitSuite { 
    
        @(Rule @getter) 
        val tempFolder = new TemporaryFolder 
    
    }