Как установить закрытую переменную-член класса в тестовом методе с powermock - PullRequest
0 голосов
/ 22 октября 2018

Я пишу тест junit для конструктора ниже.я попытался установить значение переменной mapRecords, используя Membermodifier, но все равно я получаю ноль в качестве размера списка.Будучи новичком в Junit, у меня нет точной идеи сделать это.если кто-то может помочь, это будет оценено.

открытый класс Transform {

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

    }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

С некоторыми изменениями в вашем классе я заставил его работать

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() {}
}

дайте мне знать, если это то, что вам нужно

0 голосов
/ 22 октября 2018

Для простоты теста переписайте свой класс следующим образом:

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