2015-09-28 9 views
9

मैं इस जावा SpringBoot की क्लास के लिए एक परीक्षण लिखने के लिए कोशिश कर रहा हूँ का उपयोग कर कॉल:नकली वस्तु विधि वसंत बूट और Mockito

https://github.com/callistaenterprise/blog-microservices/blob/master/microservices/composite/product-composite-service/src/main/java/se/callista/microservices/composite/product/service/ProductCompositeIntegration.java

विशेष रूप से, मैं कोशिश कर रहा हूँ "नकली" इस विधि कॉल : मैं "नकली" ServiceUtils वस्तु क्रम में यह करने के लिए करना चाहिए

URI uri = util.getServiceUrl("product"); 

मैं पता लगा।

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = ProductCompositeServiceApplication.class) 
public class ProductCompositeIntegrationTest { 

    @InjectMocks 
    @Autowired 
    private ProductCompositeIntegration productIntegration; 

    @Autowired 
    private RestTemplate restTemplate; 

    @Mock 
    private ServiceUtils util; 

    private MockRestServiceServer mockServer; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     mockServer = MockRestServiceServer.createServer(restTemplate); 
    } 

    @Test 
    public void myTest() { 
     Mockito.when(util.getServiceUrl("product")).thenReturn(URI.create("http://localhost:8080/test")); 
     ResponseEntity<Iterable<Product>> products = productIntegration.getAllProducts(); 
    } 
} 

लेकिन इस तरह से यह अभी भी मूल ServiceUtils वस्तु कहता है, और नहीं "मज़ाक उड़ाया" एक: मैं इस का उपयोग कर @Mock और @InjectMocks एनोटेशन की कोशिश की। एनोटेशन के बिना ProductCompositeIntegration पर भी कोशिश की, लेकिन इसके परिणामस्वरूप NullPointerException में परिणाम हुआ।

मैं क्या गलत कर रहा हूं?

@SpringBootApplication 
@EnableCircuitBreaker 
@EnableDiscoveryClient 
public class ProductCompositeServiceApplication { 
    public static void main(String[] args) { 
     SpringApplication.run(ProductCompositeServiceApplication.class, args); 
    } 
} 

ServiceUtils उद्देश्य यह है कि मैं उपहास करने के लिए एक कक्षा में निर्दिष्ट किया जाता है कोशिश कर रहा हूँ, स्प्रिंग के @Component एनोटेशन के साथ एनोटेट यह @Autowired का उपयोग अन्य वर्गों में सुई:


मेरा मुख्य वर्ग इस तरह दिखता है ।

उत्तर

7

बहुत सारे परीक्षण और त्रुटि के बाद मैंने इस समस्या को हल करने में कामयाब रहे।

मैं

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = ProductCompositeServiceApplication.class) 

एनोटेशन परीक्षण वर्ग aboved गिरा दिया।

मैं कक्षा कि मैं @InjectMocks के साथ परीक्षण किया गया था और निर्भरता @Mock के साथ चिह्नित:

public class ProductCompositeIntegrationTest { 
    @InjectMocks 
    private ProductCompositeIntegration productIntegration; 

    @Mock 
    private ServiceUtils util; 

    private MockRestServiceServer mockServer; 

    private RestTemplate restTemplate = new RestTemplate(); 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
     mockServer = MockRestServiceServer.createServer(restTemplate); 
     productIntegration.setRestTemplate(restTemplate); 
    } 

    @Test 
    public void someTests() { 
     when(util.getServiceUrl("product")).thenReturn(URI.create("http://localhost:8080/test")); 
     //Test code... 
    } 
} 

मुझे यकीन है कि अगर यह सबसे अच्छा तरीका ("स्प्रिंग रास्ता") है नहीं कर रहा हूँ, लेकिन इस के लिए काम किया मुझे।

यह लेख बना यह मेरे लिए सब स्पष्ट: http://rdafbn.blogspot.be/2014/01/testing-spring-components-with-mockito.html

+1

मुझे आपका दृष्टिकोण पसंद आया। मुझे ठीक इसी की तलाश थी। – user2957378

0

आप एक FactoryBean

तरह
public class MockitoFactoryBean<T> implements FactoryBean<T> { 

private Class<T> classToBeMocked; 

public MockitoFactoryBean(Class<T> classToBeMocked) { 
    this.classToBeMocked = classToBeMocked; 
} 


@Override 
public T getObject() throws Exception { 
    return Mockito.mock(classToBeMocked); 
} 

@Override 
public Class<?> getObjectType() { 
    return classToBeMocked; 
} 

@Override 
public boolean isSingleton() { 
    return true; 
} 
} 

में लिखने के लिए है अपने test-context.xml आप निम्नलिखित लाइनों को जोड़ने के लिए है।

<bean id="serviceUtilMock" class="MockitoFactoryBean"> 
    <constructor-arg value="your.package.ServiceUtil" /> 
</bean> 

आप XML विन्यास का उपयोग नहीं करते हैं, तो आप अपने जावा विन्यास में ऊपर के बराबर जोड़ने के लिए।

+0

मैं कक्षा है कि परीक्षण किया जाना करने के लिए कुछ भी बदलने की है? मैंने इस फैक्ट्री का उपयोग कर टेस्ट क्लास में सर्विस यूटिल ऑब्जेक्ट को तुरंत चालू करने की कोशिश की लेकिन परिणाम एक ही @ मॉक निजी सेवा उपयोग = factoryBean.getObject(); – Kaj

+0

आपको अपने test-context.xml में फैक्टरीबीन जोड़ना होगा। मैंने जवाब संपादित किया। –