2013-07-26 6 views
5

Ich habe vor kurzem mit JMockit und bin sehr neu bei TDD und Mocking. Ich verwende gerne Code-Coverage, um sicherzustellen, dass ich alle Zeilen für eine gegebene Klasse/Methode getestet habe.Fehler bei der Verwendung von EclEmma (Eclipse-Plugin) mit JMockit (nur mit Delegate())

Ich stieß auf den folgenden Fehler beim Versuch, JMockit (Delegate() -Funktion) und Code-Coverage. Ich schließe sowohl einen bestandenen als auch einen versagenden Test ein.

Ich bin mir nicht sicher, ob ich etwas falsch mache?

Ich würde gerne wissen, ob jemand anderes dieses Problem aufgetreten ist und ob es Workarounds oder Fixes gibt?

Ich bin nicht einmal sicher, ob dies ein JMockit Problem oder EclEmma Problem ist. Danke.

Mein Setup:

  • OS: Windows XP
  • JDK-JRE: 1.7.0
  • JUnit: 4.11
  • JMockit: 1.3
  • EclEmma: 2.2.1.201306092145
  • Eclipse: 3.6

Failure Trace:

java.lang.IllegalArgumentException: keine kompatible Methode gefunden: getType (java.lang.Integer) bei com.ps.jmockit.samples.DelegateCoverageTest $ Dog.getAnimalType (DelegateCoverageTest.java: 99) bei com.ps.jmockit.samples.DelegateCoverageTest.coverageFails (DelegateCoverageTest.java:71) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode) bei java.lang.reflect.Method.invoke (Methode. Java: 601) um sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Methode) um java.lang.reflect.Method.invoke (Method.java: 601) um org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:49) bei org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) bei org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)


Code: (coverageFails() den Fehler, der oben zeigen, wenn verwendet mit EclEmma)

package com.ps.jmockit.samples; 

import static org.hamcrest.MatcherAssert.*; 
import static org.hamcrest.Matchers.*; 

import mockit.Delegate; 
import mockit.Expectations; 
import mockit.Mocked; 

import org.junit.Test; 

/** 
* As of 7/25/2013, if I try to run the EclEmma coverage tool, it fails for {@link #coverageFails()} 
*/ 
public class DelegateCoverageTest 
{ 

    @Mocked 
    Animal fakeAnimal; 

    @Test 
    public void coverageWorks() 
    { 
     final String fake = "Fake"; 

     new Expectations() 
     { 
      { 
       DelegateCoverageTest.this.fakeAnimal.getType(1); 
       result = fake; 
      } 
     }; 

     //Arrange 
     final Dog dog = new Dog(); 

     // Act 
     final String animalType = dog.getAnimalType(this.fakeAnimal); 

     // Assert 
     assertThat(animalType, is(fake)); 
    } 

    @Test 
    public void coverageFails() 
    { 
     final String one = "One"; 
     final String two = "Two"; 

     new Expectations() 
     { 
      { 
       DelegateCoverageTest.this.fakeAnimal.getType(anyInt); 
       result = new Delegate() 
       { 
        @SuppressWarnings("unused") 
        String aDelegateMethod(final int input) 
        { 
         return input == 1 
           ? one 
           : two; 
        } 
       }; 
      } 
     }; 

     //Arrange 
     final Dog dog = new Dog(); 

     // Act 
     final String animalType = dog.getAnimalType(this.fakeAnimal); 

     // Assert 
     assertThat(animalType, is(one)); 
    } 


    //----------------- SUPPORTING CLASSES -----------------// 

    interface Animal 
    { 
     String getType(int input); 
    } 

    class Mammal implements Animal 
    { 
     @Override 
     public String getType(final int input) 
     { 
      return "Mammal"; 
     } 
    } 

    class Dog 
    { 

     public String getAnimalType(final Animal animal) 
     { 
      return animal.getType(1); 
     } 
    } 

} 
+0

Warum ist es ein Problem mit EclEmma, ​​wenn Sie die IllegalArgumentException in JMockit bekommen? – pimpf0r

+0

Und wie kommt es, dass Sie "@SuppressWarnings (" unused ") verwenden müssen? – pimpf0r

+0

@ pimpf0r Ich habe bereits in meinem Beitrag erwähnt "Ich bin nicht einmal sicher, ob dies ein JMockit Problem oder EclEmma Problem ist." In Bezug auf die "SuppressWarnings" soll nur Eclipse-Warnungen vermieden werden, da Eclipse den verwendeten Code nicht erkennt. –

Antwort