NullPointerException lors de l'exécution de tests JUnit, en disant: l'interface est nulle
Je suis en train d'écrire un programme java qui permet à l'utilisateur d'entrer une série de valeurs de données, puis pour le programme de tri à travers la recherche de la moyenne et de la médiane de cette série, à l'aide d'une interface de "traiter" les différents objets comme s'ils étaient les mêmes. Cependant, quand je lance mon test JUnit, il arrête pas de dire que mon interface est nulle.
NoiseFilter.java
package noisefilter.model;
import java.util.ArrayList;
public interface NoiseFilter {
public double getBestMesurement(ArrayList<Double> samples);
}
AveragingFilter.java
package noisefilter.model;
import java.util.ArrayList;
public class AveragingFilter implements NoiseFilter {
@Override
/**
* The method getBestMeasurement takes an array list of type double and returns a
*/
public double getBestMesurement(ArrayList<Double> samples) {
//TODO Auto-generated method stub
if (samples.equals(null)) {
throw new IllegalArgumentException("The Samples cannot be null");
}
if (samples.size() < 3) {
throw new IllegalArgumentException("The Sample size must have 3");
}
double sum = 0.0;
for (Double number : samples) {
sum += number;
}
return (sum / samples.size());
}
}
SensorData.java
package noisefilter.model;
import java.util.ArrayList;
public class SensorData implements NoiseFilter {
ArrayList<Double> data;
NoiseFilter filter;
public SensorData() {
this.data = new ArrayList<Double>();
this.filter = null;
}
public void addSample(double sample) {
data.add(sample);
}
public void setFilter(NoiseFilter filterVar) {
this.filter = filterVar;
}
public double getFilteredResult() {
if (filter.equals(null)) {
throw new IllegalStateException("The filter cannot be left null");
}
return filter.getBestMesurement(data);
}
@Override
public double getBestMesurement(ArrayList<Double> samples) {
samples = this.data;
return 0;
}
WhenAveragingFilter.java (Test Unitaire)
package noisefilter.tests;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import noisefilter.model.NoiseFilter;
import noisefilter.model.SensorData;
public class WhenAverageFiltering {
NoiseFilter filter;
SensorData dataSet;
@Before
public void setUp() throws Exception {
this.dataSet = new SensorData();
dataSet.setFilter(filter);
}
@Test
public void averageOfThree100sShouldBe100() {
dataSet.addSample(100);
dataSet.addSample(100);
dataSet.addSample(100);
assertTrue(dataSet.getFilteredResult() == 100);
}
@Test
public void averageOfThreeDifferent() {
dataSet.addSample(120);
dataSet.addSample(140);
dataSet.addSample(130);
assertTrue(dataSet.getFilteredResult() == 130);
}
@Test
public void averageOfFiveDifferent() {
dataSet.addSample(10);
dataSet.addSample(50);
dataSet.addSample(60);
assertTrue(dataSet.getFilteredResult() == 40);
}
}
Voici les erreurs que j'obtiens quand je lance le Test JUnit.
java.lang.NullPointerException
at noisefilter.model.SensorData.getFilteredResult(SensorData.java:24)
at noisefilter.tests.WhenAverageFiltering.averageOfFiveDifferent(WhenAverageFiltering.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Vous devez vous connecter pour publier un commentaire.
Vous n'avez jamais initialiser le
filter
champ dans la classe de testde sorte qu'il est
null
ici, et qu'il se propage à l'SensorData
objet à tester.filterVar
estnull
lorsque vous appelez la ci-dessus.Vous devez l'initialiser avec une mise en œuvre de votre interface, tels que votre
AveragingFilter
:Aussi, vous souhaitez tester la valeur null dans quelques endroits à l'aide de ce modèle:
Cela ne fonctionnera pas, parce que c'est l'appel de la
equals(Object)
méthode sur l'objetx
. En Java,null
n'a pas de méthodes. Vous devez toujours vérifier la valeur null à l'encontre de ses identité, à l'aide de la==
de l'opérateur. Vos exemples devraient lire:NoiseFilter
dans la forme deAveragingFilter
.Votre méthode setUp()ne crée pas un filtre.
Il crée une instance de SensorData et passe ensuite à une valeur null à setFilter.
Lorsque getFilteredResult() est appelée plus tard, il s'exécute dans un NPE.
Ajouté après avoir commenté:
Classe anonyme:
avec Mockito:
getFilteredResult
calles le filtre, que ce soit de l'utilisation d'une classe anonyme (comme Sotirios Delimanolis suggéré ci-dessus) ou regarder en se moquant de cadres comme Mockito.