Ho iniziato a utilizzare JMockit e sono molto nuovo a TDD e mocking. Mi piace usare la copertura del codice per assicurarmi di aver testato tutte le linee per una data classe/metodo.Errore durante l'utilizzo di EclEmma (plug-in Eclipse) con JMockit (solo con Delegate())
Mi sono imbattuto nel seguente errore quando provavo JMockit (funzionalità Delegate()) e copertura del codice. Sto includendo sia un test passivo che fallito.
Non so se sto facendo qualcosa di sbagliato?
Vorrei sapere se qualcun altro ha riscontrato questo problema e se sono disponibili soluzioni o correzioni?
Non sono nemmeno sicuro se si tratta di un problema JMockit o EclEmma. Grazie.
La mia configurazione:
- OS: Windows XP
- JDK-JRE: 1.7.0
- JUnit: 4.11
- JMockit: 1.3
- EclEmma: 2.2.1.201306092145
- Eclipse: 3.6
Fallimento Trace:
java.lang.IllegalArgumentException: Nessun metodo compatibile trovato: getType (java.lang.Integer) a com.ps.jmockit.samples.DelegateCoverageTest $ Dog.getAnimalType (DelegateCoverageTest.java: 99) a com.ps.jmockit.samples.DelegateCoverageTest.coverageFails (DelegateCoverageTest.java:71) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a java.lang.reflect.Method.invoke (Metodo. java: 601) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo nativo) a java.lang.reflect.Method.invoke (Method.java:601) a org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnit4TestReference.java:49) a org.eclipse.jdt.internal.junit.runner.TestExecution.run (TestExecution.java:38) a org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:467) a org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:683) a org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:390) a org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main (RemoteTestRunner.java:197)
Codice: (coverageFails() mostrerà l'errore precedente quando viene utilizzato con 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);
}
}
}
Perché è un problema con EclEmma se si ottiene l'IllegalArgumentException in JMockit? – pimpf0r
E come devi usare "@SuppressWarnings (" inutilizzato ")"? – pimpf0r
@ pimpf0r Ho già menzionato nel mio post "Non sono nemmeno sicuro che si tratti di un problema di JMockit o di EclEmma". Per quanto riguarda il "SuppressWarnings" è solo per evitare gli avvertimenti Eclipse, dal momento che eclipse non riconosce il codice viene utilizzato. –