2013-09-25 13 views
8

के साथ एक और वसंत सेवा के अंदर नकली सेवाएं मुझे वसंत ढांचे के भीतर अन्य सेवाओं के अंदर इंजेक्शन वाली सेवाओं का मज़ाक उड़ाते हुए समस्याएं आ रही हैं। यहाँ मेरी कोड है:मॉकिटो

@Service("productService") 
public class ProductServiceImpl implements ProductService { 

    @Autowired 
    private ClientService clientService; 

    public void doSomething(Long clientId) { 
     Client client = clientService.getById(clientId); 
     // do something 
    } 
} 

मैं ClientService अपने परीक्षण के अंदर नकली करना चाहते हैं, तो मैं निम्नलिखित की कोशिश की:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:/spring-config.xml" }) 
public class ProductServiceTest { 

    @Autowired 
    private ProductService productService; 

    @Mock 
    private ClientService clientService; 

    @Test 
    public void testDoSomething() throws Exception { 
     when(clientService.getById(anyLong())) 
       .thenReturn(this.generateClient()); 

     /* when I call this method, I want the clientService 
     * inside productService to be the mock that one I mocked 
     * in this test, but instead, it is injecting the Spring 
     * proxy version of clientService, not my mock.. :(
     */ 
     productService.doSomething(new Long(1)); 
    } 

    @Before 
    public void beforeTests() throws Exception { 
     MockitoAnnotations.initMocks(this); 
    } 

    private Client generateClient() { 
     Client client = new Client(); 
     client.setName("Foo"); 
     return client; 
    } 
} 

clientServiceproductService अंदर स्प्रिंग प्रॉक्सी संस्करण, नहीं नकली है कि मैं चाहते हैं। क्या मैं मॉकिटो के साथ क्या करना चाहता हूं?

उत्तर

0

वहाँ इस लक्ष्य को हासिल करने के लिए और अधिक तरीके हैं, सबसे आसान तरीका करने के लिए इस don't use field injection, but setter injection जिसका मतलब है कि हो जाएगा आप होना चाहिए:

@Autowired 
public void setClientService(ClientService clientService){...} 

आपकी सेवा कक्षा में है, तो आप में सेवा करने के लिए अपने नकली इंजेक्षन कर सकते हैं परीक्षण वर्ग:

@Before 
public void setUp() throws Exception { 
    productService.setClientService(mock); 
} 

important: यदि यह केवल एक इकाई परीक्षण है, पर विचार करें SpringJUnit4ClassRunner.class, लेकिन MockitoJunitRunner.class का उपयोग नहीं करते तो यह है कि आप भी अपने क्षेत्रों के लिए इंजेक्षन फ़ील्ड का उपयोग कर सकते हैं।

+1

धन्यवाद, मैं करने की कोशिश की है कि समाधान और ठीक काम किया, लेकिन मुझे लगता है कि सेवाओं में सेटर इंजेक्शन को बदल नहीं सकते, इसलिए मेरे समाधान था करने के लिए मेरे परीक्षणों पर स्वत: नियोजित एनोटेशन को हटाएं और हाथों से सेवा बनाएं, जैसे कि: 'इंजेक्टमैक्स निजी उत्पाद सेवा उत्पाद सेवा = नया उत्पाद सेवा Impl(); ' – br4zuca

+0

@ br4zuca आप इसे' @InjectMocks निजी उत्पाद सेवा उत्पाद सेवा 'के साथ कर सकते हैं, init में नहीं यह मैनुअल, मजाक करो यह करो – Jaiwo99

+1

मैंने '@ इंजेक्शन मॉक्स' के साथ 'productService' को छोड़कर मॉकिटो छोड़ने की कोशिश की, लेकिन काम नहीं किया क्योंकि 'उत्पाद सेवा' एक इंटरफ़ेस है, इसे फेंक दिया गया:' org.mockito.exceptions.base.MockitoException: प्रकार 'ProductService' है एक इंटरफेस ', तो यह तुरंत चालू करने में सक्षम नहीं था। – br4zuca

4

आप @InjectMocks साथ ProductService टिप्पणी करने की जरूरत है:

@Autowired 
@InjectMocks 
private ProductService productService; 

यह आपके ProductService में ClientService नकली इंजेक्षन जाएगा।

+0

धन्यवाद डेबजीत, लेकिन मुझे एहसास हुआ कि मॉकिटो के नकली इंजेक्शन के साथ संयोजन में वसंत के इंजेक्शन का उपयोग करने का कोई तरीका नहीं है ... इसलिए मेरा समाधान उत्पाद सेवा को हाथों से बनाना और 'इंजेक्टमैक्स' के साथ मॉक्स इंजेक्ट करना था जैसा आपने कहा था , लेकिन '@ Autowired' का उपयोग नहीं कर रहा है: ' @ इंजेक्टमोक्स निजी उत्पाद सेवा उत्पाद सेवा = नया उत्पाद सेवा Impl(); ' – br4zuca

+0

यह अजीब बात है। मैं इन दो एनोटेशन का एक साथ उपयोग कर रहा हूं। क्या आपने इसका परीक्षण किया है इन दोनों का एक साथ उपयोग करते समय कोई अपवाद है। –

+0

हां, मैंने उत्पाद सेवा पर '@ इंजेक्टमोक्स' के साथ भी इसका परीक्षण किया, क्लाइंट सर्विस इनके अंदर मॉक ऑब्जेक्ट के बजाय स्प्रिंग प्रॉक्सी के साथ लोड किया गया था। हो सकता है कि आप जिस स्प्रिंग-टेस्ट संस्करण का उपयोग कर रहे हैं उससे अलग है, मेरा संस्करण 3.0.1 है। रिलीज, आपका संस्करण क्या है? – br4zuca

0

इसके अलावा

@Autowired 
@InjectMocks 
private ProductService productService; 

में जोड़े निम्न विधि

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
}