Mocking Java enum to add a value to test fail case

前端 未结 10 1414
死守一世寂寞
死守一世寂寞 2020-11-28 23:55

I have an enum switch more or less like this:

public static enum MyEnum {A, B}

public int foo(MyEnum value) {
    switch(value) {
        case(A):          


        
10条回答
  •  一向
    一向 (楼主)
    2020-11-29 00:32

    First of all Mockito can create mock data which can be integer long etc It cannot create right enum as enum has specific number of ordinal name value etc so if i have an enum

    public enum HttpMethod {
          GET, POST, PUT, DELETE, HEAD, PATCH;
    }
    

    so i have total 5 ordinal in enum HttpMethod but mockito does not know it .Mockito creates mock data and its null all the time and you will end up in passing a null value . So here is proposed solution that you randomize the ordinal and get a right enum which can be passed for other test

    import static org.mockito.Mockito.mock;
    
    import java.util.Random;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.Matchers;
    import org.mockito.internal.util.reflection.Whitebox;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    
    import com.amazonaws.HttpMethod;
    
    
    
    
    //@Test(expected = {"LoadableBuilderTestGroup"})
    //@RunWith(PowerMockRunner.class)
    public class testjava {
       // private static final Class HttpMethod.getClass() = null;
        private HttpMethod mockEnumerable;
    
        @Test
        public void setUpallpossible_value_of_enum () {
            for ( int i=0 ;i<10;i++){
                String name;
                mockEnumerable=    Matchers.any(HttpMethod.class);
                if(mockEnumerable!= null){
                    System.out.println(mockEnumerable.ordinal());
                    System.out.println(mockEnumerable.name());
    
                    System.out.println(mockEnumerable.name()+"mocking suceess");
                }
                else {
                    //Randomize all possible  value of  enum 
                    Random rand = new Random();
                    int ordinal = rand.nextInt(HttpMethod.values().length); 
                    // 0-9. mockEnumerable=
                    mockEnumerable= HttpMethod.values()[ordinal];
                    System.out.println(mockEnumerable.ordinal());
                    System.out.println(mockEnumerable.name());
                }
            }
        }
    
    
    
    
    
    
    
        @Test
        public void setUpallpossible_value_of_enumwithintany () {
            for ( int i=0 ;i<10;i++){
                String name;
                mockEnumerable=    Matchers.any(HttpMethod.class);
                if(mockEnumerable!= null){
                    System.out.println(mockEnumerable.ordinal());
                    System.out.println(mockEnumerable.name());
    
                    System.out.println(mockEnumerable.name()+"mocking suceess");
                } else {
                   int ordinal;
                   //Randomize all possible  value of  enum 
                   Random rand = new Random();
                   int imatch =  Matchers.anyInt();
                   if(  imatch>HttpMethod.values().length)
                     ordinal = 0    ;
                   else
                    ordinal = rand.nextInt(HttpMethod.values().length);
    
                   // 0-9.  mockEnumerable=
                   mockEnumerable= HttpMethod.values()[ordinal];
                   System.out.println(mockEnumerable.ordinal());
                   System.out.println(mockEnumerable.name());       
                }
           }  
        }
    }
    

    Output :

    0
    GET
    0
    GET
    5
    PATCH
    5
    PATCH
    4
    HEAD
    5
    PATCH
    3
    DELETE
    0
    GET
    4
    HEAD
    2
    PUT
    

提交回复
热议问题