2015-03-31 4 views
5

जुनीट परीक्षण के लिए मैं एक ओवरलोडेड विधि का नकल करना चाहता हूं। हालांकि मॉकबिल्डर में कई विधियों को लागू करने की कोई आवश्यकता नहीं है। मैं इस तरह कुछ करना चाहता हूँ:मॉकिटो विभिन्न तर्क प्रकारों को ओवरलोडेड विधि को नकल करने के लिए अनुमति दें

Mockito.when(mock.getSomeInfo(Mockito.any(ArgumentType1.class) OR Mockito.any(ArgumentType2.class), Mockito.any(ArgumentType3.class))).then(new Answer<AnswerType>() {..} 

मैं जानता हूँ कि यह OR बयान के साथ काम नहीं करता है, लेकिन वहाँ एक और तरीका Mockito में यह करने के लिए है?

+1

इसी http://stackoverflow.com/questions/5594645/verify-whether-one-of-three-methods को -इस-इनकॉक्ड-साथ-मॉकिटो – BretC

+0

तो मैं समझता हूं कि मैं एक मॉकबिल्डर विधि में दोनों मोजे नहीं प्राप्त कर सकता हूं? – Chry007

+2

नहीं, मुझे पता नहीं है कि मुझे पता है – BretC

उत्तर

1

आप इसे कस्टम matcher के साथ कर सकते हैं।

चेतावनी: जटिल तर्क मिलान, विशेष रूप से कस्टम तर्क मैचर्स का उपयोग करने के साथ उचित रहें, क्योंकि यह परीक्षण को कम पठनीय बना सकता है। कभी-कभी मैक्स को पारित तर्कों के लिए बराबर() को कार्यान्वित करना बेहतर होता है (मॉकिटो स्वाभाविक रूप से तर्क मिलान के लिए बराबर() का उपयोग करता है)। यह परीक्षण क्लीनर बना सकते हैं।


public class TypeOrMatcher extends ArgumentMatcher<Object> { 

    private final List<Class<?>> clazzes; 

    public TypeOrMatcher(Class<?>...clazzes) { 
    this.clazzes = new ArrayList<Class<?>>(clazzes); 
    } 

    public boolean matches(Object actual) { 
    if (actual == null) { 
     return false; 
    } 
    Class<?> actualClass = actual.getClass(); 
    for (Class<?> clazz : clazzes) { 
     if (clazz.isAssignableFrom(actualClass) { 
     return true; 
     } 
    } 
    return false; 
    } 
} 

TypeOrMatcher isTypeOneOrTwo = new TypeOrMatcher(
    ArgumentType1.class, ArgumentType2.class); 

Some mockObj = mock(Some.class); 
when(mockObj.someMethod(argThat(isTypeOneOrTwo), any(ArgumentType3.class)) 
    .thenReturn(true); 
1

आप जवाब वस्तु आप वापस जाने के लिए और उसके बाद इस उत्तर वापसी चाहते हैं पूर्व बना सकते हैं।

class A { 

    public int test(final String s) { 
     return 0; 
    } 

    public int test(final int i) { 
     return 0; 
    } 
} 

और परीक्षा पद्धति में:

public void testAtest() { 
    final A a = Mockito.mock(A.class); 

    final Answer<Integer> answer = new Answer<Integer>() { 

     @Override 
     public Integer answer(final InvocationOnMock invocation) throws Throwable { 
      return 0; 
     } 
    }; 

    Mockito.when(a.test(Matchers.anyInt())).then(answer); 
    Mockito.when(a.test(Matchers.anyString())).then(answer); 
} 
0

एक उदाहरण मैं एक सेवा वर्ग है कि परीक्षण विधि से बुलाया जाएगा है के लिए:

public interface AService{ 

    public ReturnObject addNewItem(String param1, String param2); 

    public ReturnObject addNewItem(String param1, String param2, boolean isOk); 

} 

MainServiceImpl कक्षा में एक विधि होगा नीचे एक अधिभारित विधि को कॉल करें:

@Service("mainService") 
public class MainServiceImpl implements MainService { 

@Autowired 
    private AService aService; 

public ReturnObject saveItem(String itemName, String itemCode){ 
    return aService.addNewItem(itemName, itemCode); 
} 

} 

तो जब हमें saveItem के लिए यूनिट टेस्ट लिखना है, तो addNewItem के रूप में पहले से अधिभारित विधि को कॉल करने के लिए विधि, यदि आपने नकली बनाने के सामान्य तरीके का उपयोग किया था तो आप उत्तर ऑब्जेक्ट रिटर्न में जो चाहते हैं उसे वापस नहीं करेंगे।

@RunWith(PowerMockRunner.class) 
    @PrepareForTest({ }) 
    public class ItemTest{ 

@Test 
    public void testSaveItem() throws Exception { 
    //create a real object of MainServiceImpl 
    MainServiceImpl mainService = new MainServiceImpl(); 
    //create a normal way for a mocking object 
    AService aService = Mockito.mock(AService.class); 
    // Add mock object to MainServiceImpl instance 
    ReflectionTestUtils.setField(mainService, "aService", aService); 

    //Mock when aService call to addNewItem() method 
    PowerMockito.when(aService , "addNewItem", Mockito.anyString(), Mockito.anyString()).then(new Answer<ReturnObject>() { 
      @Override 
      public ReturnObject answer(InvocationOnMock invocation) throws Throwable { 
       return new ReturnObject("saveOK"); 
      } 
     }); 

    ReturnObject returnObj = mainService.saveItem("Book", "Code123"); 

    Assert.assertNotNull(returnObj); 
} 
} 

कोशिश testSaveItem तो सफलता नीचे testSaveItem साथ द्वारा उपरोक्त को बदलने के लिए:

@Test 
      public void testSaveItem() throws Exception { 
      //create a real object of MainServiceImpl 
      MainServiceImpl mainService = new MainServiceImpl(); 

      //create a special way for a mocking object by add 
      //the answer at create the mock object 

      final Answer<ReturnObject> answer = new Answer<ReturnObject>() { 
      @Override 
      public ReturnObjectanswer(final InvocationOnMock invocation) throws Throwable { 
       return new ReturnObject("saveOK"); 
      } 
      }; 
      AService aService = Mockito.mock(AService.class, answer); 

      // Add mock object to MainServiceImpl instance 
      ReflectionTestUtils.setField(mainService, "aService", aService); 

      //Mock when aService call to addNewItem() method 
      PowerMockito.when(aService , "addNewItem", Mockito.anyString(), Mockito.anyString()).then(new Answer<ReturnObject>() { 
        @Override 
        public ReturnObject answer(InvocationOnMock invocation) throws Throwable { 
         return new ReturnObject("saveOK"); 
        } 
       }); 

      ReturnObject returnObj = mainService.saveItem("Book", "Code123"); 

      Assert.assertNotNull(returnObj); 
     } 
संबंधित मुद्दे