2015-03-31 19 views
5

alay izin verin mockito. Bununla birlikte, mockbuilder'da çeşitli yöntemler uygulamaya gerek yoktur. Böyle bir şey yapmak istiyorum:farklı argüman tipleri ben aşırı yüklenmiş bir yöntem taklit istiyor JUnit test için aşırı yöntem

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

Ben OR deyimi ile çalışmaz biliyorum ama Mockito bunu yapmanın başka bir yolu var mı?

+1

Benzer http://stackoverflow.com/questions/5594645/verify-whether-one-of-three-methods için -is-çağrılan-ile-mockito – BretC

+0

Yani ben bir mockbuilder yönteminde her iki mocks alamayan anladın mı? – Chry007

+2

Ben – BretC

cevap

1

Bir özel matcher ile yapabilirsiniz.

Uyarı: Testi daha az okunabilir hale getirebileceğinden, karmaşık argüman eşleştirmeyi, özellikle de özel argüman eşleştirmelerini kullanmak mantıklı olabilir. Bazen mocks geçirilen bağımsız değişkenler için eşittir() uygulamak daha iyidir (mockito doğal argüman eşleştirme için eşittir() kullanır). Bu test temizleyici yapabilir.


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

Sen dönmek ve sonra bu cevabı dönmek istiyorum cevap nesnesi önceden oluşturabilir.

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

ben test yönteminden çağrılacak bir hizmet sınıfına sahip bir örnek için:

class A { 

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

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

Ve test yönteminde

public interface AService{ 

    public ReturnObject addNewItem(String param1, String param2); 

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

} 

MainServiceImpl sınıfında bir yöntemi var olacak

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

@Autowired 
    private AService aService; 

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

} 
: aşırı yüklenmiş bir yöntemi, aşağıdaki gibi çağrı

yüzden saveItem Eğer cevap nesne karşılığında istediğini döndürmez cevap daha sonra bir taklidini oluşturmak için normal şekilde kullanılan olsaydı zaten addNewItem olarak aşırı yönteme çağıran yöntem için birim test yazmak zorunda olduğunda.

@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); 
} 
} 

deneyin sonra başarı aşağıda testSaveItem ile yukarıda testSaveItem yerine:

@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); 
     } 
İlgili konular