2016-06-11 8 views
0

Ich habe Probleme zu kontrollieren, was mit den Variablen innerhalb der Methoden, die ich testen möchte, los ist. In diesem Beispiel ist die Eingabe für die zu testende Methode ein verspottetes oder injizierbares Objekt. Wenn Sie jedoch versuchen, etwas damit zu tun, erhalten Sie Null * -Ausnahmen.Jmockit: Unfähig, inneres Feld zu verspotten. Immer endet als Null

Klasse und Methode getestet:

public class SomeClass { 
    public SomeClass() {} 

    public void myMethod(InputClass input) { 
     //how do I set this field so that no matter what, I don't get an exeption? 
     long someLong = Long.parseLong(input.getSomeLong()); 

     // how do I prevent the NumberFormatException when Long.parseLong() is called in this situation? 
     SomeInnerClass innerClass = SomeInnerClass(Long.parseLong(input.getSomeLong())); 
     // how do I prevent the NumberFormatException when Long.parseLong() is called in this situation? 
     innerClass.doStuff(Long.parseLong(input.getSomeLong())); 

     // ... 
    } 
} 

Testklasse:

public class TestSomeClass { 
    @Tested private SomeClass classBeingTested; 
    @Injectable SomeInnerClass innerClass; 
    @Injectable InputClass input; // doesn't matter if I use @mocked here 

    @Test 
    public void shouldTestSomething() { 
     new NonStrictExpectations() {{ 
      // some expectations with innerClass... 
     }};  

     classBeingTested.myMethod(input); // at this point I would get an error from Long.parsLong() 

     // ... 
    } 
} 

Ich möchte in der Lage sein, Fehler in bestimmten Teilen des Codes zu ignorieren innerhalb der Methode, die ich bin testen. Der Long.parseLong() Fehler in diesem speziellen Fall interessiert mich überhaupt nicht. Ich versuche das derzeit nicht zu testen, aber es steht dem echten Test im Weg. Wie erstellt man ein falsches Objekt anstelle des Objekts, das Probleme verursacht, so dass es ignoriert werden kann, während ich einen anderen Teil der Methode teste?

+0

würde ich so etwas wie Mockito verwenden. Dann können Sie den Test sagen, wenn xyz.myMethohd() Return abc Ergebnisse aufgerufen wird. Auf diese Weise steuern Sie genau, was der Code testet. – Dale

+0

@Dale Das gleiche mit JMockit. Das Problem scheint hier zu sein, dass das OP mit Spott im Allgemeinen nicht vertraut ist. –

Antwort

0

Bitte benutzen Sie den folgenden Code und prüfen Sie, ob es hilft. Sie müssen die Abhängigkeit zu Mockito in Ihr Projekt hinzufügen.Eine wichtige denken Sie sicher, dass Sie @RunWith(MockitoJUnitRunner.class) in Ihrer Testklasse verwenden.

@RunWith(MockitoJUnitRunner.class) 
public class TestSomeClass { 
    @Tested private SomeClass classBeingTested; 
    @Injectable SomeInnerClass innerClass; 
    @Mock 
    InputClass input; // doesn't matter if I use @mocked here 

    @Test 
    public void shouldTestSomething() { 
     new NonStrictExpectations() {{ 
      // some expectations with innerClass... 
     }};  
     Mockito.when(input).getSomeLong().thenReturn("11").thenReturn("11");//This will return 11 in place of input.getSomeLong()for 2 times 
     classBeingTested.myMethod(input); // In this case yoou will not get an error from Long.parsLong() 

     // ... 
    } 
} 

=========================================== ============

Mit JMockit:

import org.junit.Test; 

import mockit.Injectable; 
import mockit.Mocked; 
import mockit.NonStrictExpectations; 
import mockit.Tested; 

public class SomeClassTest { 
    @Tested 
    private SomeClass classBeingTested; 
    @Injectable 
    SomeInnerClass innerClass; 

    @Mocked 
    InputClass input; 

    @Test 
    public void shouldTestSomething() { 
     new NonStrictExpectations() { 

      { 
       input.getSomeLong(); 
       returns("11"); 
      } 
     }; 

     classBeingTested.myMethod(input); 

     // ... 
    } 
} 
+0

Es gibt keine Möglichkeit, dies mit JMokit zu tun? Unser Team verwendet Mockito nicht. – user2514676

+0

Ja, Sie können Mockito verwenden, um es zu testen. Ich habe meinen Code entsprechend aktualisiert. – sauumum

+0

Ich bekomme eine NullPointerException für die "Eingabe" -Variable, wenn "input.getSomeLong()" in der sentTestSomething() -Methode – user2514676