【问题标题】:How to set the private member variable of a class in test method with powermock如何使用powermock在测试方法中设置类的私有成员变量
【发布时间】:2018-10-22 16:57:13
【问题描述】:

我正在为下面的构造函数编写一个 junit 测试。我尝试使用 Membermodifier 设置 mapRecords 变量的值,但我仍然得到零作为列表的大小。作为junit的新手,我没有确切的想法去做。如果有人可以提供帮助,将不胜感激。

公共类变换{

    private MapMetadataDAO mapMetadataDAO;
    private Map<String,String> srcTargetMap;
    private List<MapMetadata> mapRecords;

    public Transform(String transformationId) throws GenericFlowException {
        try {
            mapMetadataDAO=new MapMetadataDAO();
        } catch (DAOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mapRecords = mapMetadataDAO.findMapMetadataByTransformationID(transformationId);
        System.out.println(mapRecords.size()); 
        if(mapRecords.isEmpty()){
            throw new GenericFlowException("Map meta data is not defined for the transformationId "+transformationId);
        }
        map();
    }
}

测试类: 如果我不使用 new 创建对象,我将无法调用构造函数

@RunWith(PowerMockRunner.class)
@PrepareForTest({Transform.class, MapMetadataDAO.class})
public class TransformTest {


    @Test
    public void constructorTest() throws Exception
    {
        PowerMockito.suppress(PowerMockito.constructor(MapMetadataDAO.class));

        MapMetadataDAO dao = PowerMockito.mock(MapMetadataDAO.class);
        MapMetadata mapMetaData = PowerMockito.mock(MapMetadata.class);
        PowerMockito.whenNew(MapMetadataDAO.class).withNoArguments().thenReturn(dao);
        List<MapMetadata> list = new ArrayList<>();
        list.add(mapMetaData);
        Transform trans = PowerMockito.mock(Transform.class, Mockito.CALLS_REAL_METHODS);
        MemberModifier.field(Transform.class, "mapRecords").set(trans, list);
        PowerMockito.when(dao.findMapMetadataByTransformationID("transformationID")).thenReturn(list);
        Transform transform = new Transform("transformationId");

        PowerMockito.whenNew(Transform.class).withAnyArguments().thenReturn(trans);

    }
}

【问题讨论】:

    标签: junit mockito powermock powermockito


    【解决方案1】:

    在你的课堂上做了一些改变,我让它工作了

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.InjectMocks;
    import org.mockito.Mock;
    import org.mockito.Mockito;
    import org.mockito.MockitoAnnotations;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    
    @RunWith(org.powermock.modules.junit4.PowerMockRunner.class)
    @PrepareForTest({MapMetadataDAO.class, Transform.class})
    public class TransformTest {
        @Mock
        private MapMetadataDAO mapMetadataDAO;
        @Mock
        private Map<String,String> srcTargetMap;
        @InjectMocks
        private Transform Transform = new Transform();
    
        @Before
        public void init() {
            MockitoAnnotations.initMocks(this);
        }
    
        @Test
        public void testConstructor() throws Exception {
            List<MapMetadata> mapRecords = new ArrayList<MapMetadata>();
            mapRecords.add(new MapMetadata());
            PowerMockito.whenNew(MapMetadataDAO.class).withNoArguments().thenReturn(mapMetadataDAO);
            PowerMockito.when(mapMetadataDAO.findMapMetadataByTransformationID(Mockito.anyString())).thenReturn(mapRecords);
            Transform.getTransform("transformationId");
        }
    
    }
    
    class Transform{
    
        private MapMetadataDAO mapMetadataDAO;
        private Map<String,String> srcTargetMap;
        private List<MapMetadata> mapRecords;
    
        public Transform() {}
    
        public void getTransform(String transformationId){
            try {
                mapMetadataDAO=new MapMetadataDAO();
                mapRecords = mapMetadataDAO.findMapMetadataByTransformationID(transformationId);
                System.out.println(mapRecords.size()); 
                if(mapRecords.isEmpty()){
                    throw new GenericFlowException("Map meta data is not defined for the transformationId "+transformationId);
                }
                map();
            } catch (DAOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (GenericFlowException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        private void map() {}
    }
    

    如果这是你需要的,请告诉我

    【讨论】:

      【解决方案2】:

      为了便于测试,像这样重写你的类:

      public class Transform {
      
          private MapMetadataDAO mapMetadataDAO;
          private Map<String,String> srcTargetMap;
          private List<MapMetadata> mapRecords;
      
          public Transform(MapMetadataDAO mapMedatadaDAO, String transformationId) throws GenericFlowException {
              mapRecords = mapMetadataDAO.findMapMetadataByTransformationID(transformationId);
              System.out.println(mapRecords.size()); 
              if(mapRecords.isEmpty()){
                  throw new GenericFlowException("Map meta data is not defined for the transformationId "+transformationId);
              }
              map();
          }
      }
      

      然后你的测试:

                      @RunWith(PowerMockRunner.class)
                      @PrepareForTest({MapMetadataDAO.class})
                      public class TransformTest {
      
                          @Test
                          public void constructorTest() throws Exception
                          {
              MapMetadata mapMetaData = new MapMetadata();
                              List<MapMetadata> list = new ArrayList<>();
                              list.add(mapMetaData);        
                              MapMetadataDAO dao = PowerMockito.mock(MapMetadataDAO.class);
          String transformationId = "transformationId";         
      PowerMockito.when(dao.findMapMetadataByTransformationID(transformationId)).thenReturn(list);
                              Transform transform = new Transform(dao, transformationId);
                          }
                      }
      

      【讨论】:

      • 即使在将模拟对象添加到列表之后,如果我尝试获取 mapRecords.size() 它也会给出 0 并导致异常。 @克里斯蒂安
      • 我认为这是因为您第一次使用“transformationID”,然后您使用了“transformationId”。我编辑了我的解决方案来解决这个问题。
      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多