मैंने सोचा कि यह अपेक्षाकृत आसान होगा, लेकिन हां, ऐसा लगता है कि यह नहीं है।डबल ब्रेस प्रारंभिकता प्रकार भ्रम
मैं वर्तमान में जावा ईई 6.
का उपयोग कर टेस्ट मैं JUnit 4.11 उपयोग करते हैं, आईडीई के रूप में ग्रहण केपलर के साथ के लिए मेरी परियोजना में एक फसाड की तरह संरचना के लिए यूनिट टेस्ट लिख रहा हूँ।
जो मैं देख सकता हूं, वहां से डबल ब्रेस प्रारंभिकता के साथ कुछ "गलत" लगता है, लेकिन मुझे पर मेरी उंगली डालने के लिए पर्याप्त जानकारी नहीं है क्यों यह काम नहीं करता है जैसा मुझे लगता है कि यह चाहिए।
बात करने के लिए प्राप्त करने के लिए, मैं निम्नलिखित वर्ग का उपयोग कर रहा एक केंद्रीकृत स्थान में रूपांतरण बनाने के लिए:
package com.example-company.util.converters;
import java.util.HashMap;
import java.util.Map;
import com.example-company.model.Location;
import com.example-company.model.Right;
public final class ModelConverters {
private static final Map<Class<?>, ModelConverter<?, String>> modelConverterBacking = new HashMap<Class<?>, ModelConverter<?, String>>();
static {
modelConverterBacking.put(Right.class, new RightConverter());
modelConverterBacking.put(Location.class, new LocationConverter());
};
public static <T> String convert(final T input)
throws IllegalStateException {
@SuppressWarnings("unchecked")
ModelConverter<T, String> modelConverter = (ModelConverter<T, String>) modelConverterBacking
.get(input.getClass());
if (modelConverter == null) {
throw new IllegalStateException("No mapping found for "
+ input.getClass());
}
return modelConverter.convertToView(input);
}
}
जहां तक इस चला जाता है यह ज्यादातर जेनरिक और एक स्थिर नक्शे के साथ खेल रहा है। अब मैंने फैसला किया कि मुझे इसके लिए कुछ यूनिट-टेस्ट लिखना चाहिए। निम्नलिखित वर्ग थोड़ा छोटा है, सभी टेस्ट-केस जो समस्या को पुन: उत्पन्न नहीं करते हैं उन्हें हटा दिया गया था।
package com.example-company.test.unit.util.converters;
import static org.junit.Assert.assertEquals;
import com.example-company.model.Location;
import com.example-company.util.converters.ModelConverters;
import org.junit.Test;
public class ModelConvertersFacadeTests {
@Test
public void test_MappingForLocationExists() {
final Location stub = new Location() {
{
setLocationName("");
}
};
String actual = ModelConverters.convert(stub);
assertEquals("", actual);
}
}
अब तक इतना अच्छा है, वास्तव में कुछ भी नहीं होना चाहिए, कम से कम मुझे जो मिला है। और वह है: निम्नलिखित स्टैकट्रेस के साथ एक फैंसी IllegalStateException
:
java.lang.IllegalStateException: No mapping found for class com.example-company.test.unit.util.converters.ModelConvertersFacadeTests$1
at com.example-company.util.converters.ModelConverters.convert(ModelConverters.java:23)
at com.example-company.test.unit.util.converters.ModelConvertersFacadeTests.test_MappingForLocationExists(ModelConvertersFacadeTests.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
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.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)
पहली बात मैंने किया था, यह फिर से चलाया गया था, और फिर एक ब्रेकपाइंट की स्थापना का निरीक्षण करने के क्या ModelConverters#convert()
अंदर होता है क्या मैं थोड़ा flabberghasted गया मैं:
ऐसा लगता है कि input.getClass()
फिर से ModelConvertersFacadeTests
बदलता है। लेकिन यह com.example-company.model.Location
क्यों नहीं लौटाता है?
[आपको आमतौर पर डबल ब्रेस प्रारंभिकरण का उपयोग करने से सावधान रहना चाहिए] (http://stackoverflow.com/q/924285/521799) –