2011-09-08 19 views

Odpowiedz

7

EDYCJA: Po wydaniu JUnit 4.11 można teraz dodawać adnotacje do metody za pomocą @Rule.

będzie go używać jak:

private TemporaryFolder folder = new TemporaryFolder(); 

@Rule 
public TemporaryFolder getFolder() { 
    return folder; 
} 

We wcześniejszych wersjach JUnit, patrz poniższa odpowiedź.

-

Nie, nie można używać tego bezpośrednio od Scala. Pole musi być publiczne i niestatyczne. Od org.junit.Rule:

public @interface Rule: Annotates fields that contain rules. Such a field must be public, not static, and a subtype of TestRule.

Nie można zadeklarować publicznych pól w Scala. Wszystkie pola są prywatne i udostępniane przez akcesorów. Zobacz odpowiedź na tę question.

Poza tym, nie jest już wniosek wzmocnienie dla JUnit (ciągle otwarty):

Extend rules to support @Rule public MethodRule someRule() { return new SomeRule(); }

Inną opcją jest to, że pola niepubliczne być dozwolone, ale to już zostało odrzucone : Allow @Rule annotation on non-public fields.

więc opcje są:

  1. klon JUnit i wdrożenia pierwszego sugestię, metody i złożyć wniosek ściągania
  2. rozszerzenie klasy Scala z klasy Java, który implementuje @Rule

-

public class ExpectedExceptionTest { 
    @Rule 
    public ExpectedException thrown = ExpectedException.none(); 
} 

i dziedziczy że:

class ExceptionsHappen extends ExpectedExceptionTest { 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 

który działa poprawnie.

+1

Dla jasności: to (teraz) działa na Scala (ale tylko z metody: '@Rule def myRule = ...' a nie z atrybutem takiego jak '@ Reguła warta myRule = ... ') –

0

Bez znajomości zasad JUnit i bez testowania, ponieważ nie mam odpowiedniego ustawienia pod ręką, wychodzę na kończynę i zasugeruję, aby włączyć rzucenie w val. Przypuszczam, że jest to jakiś członek, który jest zainicjalizowany czymś, a następnie dostaje jakiś stan, a następnie inna maszyna sprawdza stan przed czymś. Zawsze tworzysz nowe i ciągle zapominasz o oczekiwaniach.

0

Jeśli program Scala ma coś podobnego do importu statycznego, wówczas catch-exception jest alternatywą dla reguły @ ExpectedException @ JUnit 4.7.

6

Aby to działało z JUnit 4.11 w Scala, należy meta-adnotacji adnotacji tak, że adnotacja ma zastosowanie tylko do (syntetyczny) metody getter, nie pole bazowy:

import org.junit._ 
import scala.annotation.meta.getter 

class ExceptionsHappen { 

    @(Rule @getter) 
    def thrown = rules.ExpectedException.none 

    @Test 
    def badInt: Unit = { 
    thrown.expect(classOf[NumberFormatException]) 
    Integer.parseInt("one") 
    } 
} 
0

jako bardzo początkujących do Scala jestem tylko przy użyciu bardzo proste obejście: jawnie wychwytywanie wyjątków i niepowodzenie, jeśli oczekiwany wyjątek nie zostanie zgłoszony.

Poniżej znajduje się szkielet próbki:

try { 
    *your code that should throw an exception* 
    fail("Did not generate *the.Exception.you.expect*") 
} catch { 
    case t: *the.Exception.you.expect* => // do nothing, it's expected :) 
} 
Powiązane problemy