издевательский метод не вызывается - PullRequest
0 голосов
/ 11 февраля 2019

Я использую testng с Mockito и из-за ограничений не могу использовать PowerMock.Когда я пытаюсь запустить свой тест, по какой-то причине реальный метод вызывается вместо макета!Я добавил класс-оболочку вокруг класса, который имеет статические методы.Из документации я знаю, что Mockito не поддерживает статические методы.Итак, для этого я написал простую оболочку, которая просто вызывает статический метод в этом классе.

public class BatTrafficManagerStatsHelperTest {

    @Mock
    private MtsConfFactoryWrapper mtsConfFactoryWrapper = new MtsConfFactoryWrapper();

    private static final String EXPECTED_JSON_STR = "{"
            + "         \"duration\": 100,"
            + "         \"timestamp\": \"1970-01-01T00:00:00\","
            + "         \"cellMetrics\": {"
            + "           \"enb1_cell1\": {"
            + "             \"handoverAttempts\": 2,"
            + "             \"rrcConnectionAttempts\": 1"
            + "           }"
            + "         },"
            + "         \"trafficProfileMetrics\": {"
            + "           \"voipSpeech_2PDN\": {"
            + "             \"srMtSuccess\": 4,"
            + "             \"numberOfUEs\": 100,"
            + "             \"srMoSuccess\": 3,"
            + "             \"attachSuccess\": 5,"
            + "             \"rrcConnectionAttempts\": 1"
            + "           }"
            + "         },"
            + "         \"ueGroupMetrics\": {"
            + "           \"ueGroup1\": {"
            + "             \"handoverAttempts\": 2,"
            + "             \"numberOfUEs\": 100,"
            + "             \"rrcConnectionAttempts\": 1"
            + "           }"
            + "         }"
            + "       }";

    @BeforeMethod
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    /**
     * getBstmString()
     * Setup mock, tests getBstmString() and verify result
     *
     * @throws Exception
     */
    @Test
    public void testGetBtmString() throws Exception {
        final Date date = Mockito.mock(Date.class);
        Mockito.when(date.getTime()).thenReturn(0L);

        final Map<OptimizedRoute, List<StatsQueue>> ueStatsTrackerMock = getUeStatsTrackerMock();
        final Map<Enb, List<OptimizedCellStatsQueue>> cellStatsTrackerMock = getCellStatsTrackerMock();
        final MtsConfBuilder confBuilderMock = Mockito.mock(MtsConfBuilder.class);
        final Tracker trackerMock = Mockito.mock(Tracker.class);

        Mockito.when(mtsConfFactoryWrapper.getConfBuilderr()).thenReturn(confBuilderMock);
        Mockito.when(confBuilderMock.getTracker()).thenReturn(trackerMock);
        Mockito.when(trackerMock.getUeStatsTracker()).thenReturn(
                ueStatsTrackerMock);
        Mockito.when(trackerMock.getCellStatsTracker()).thenReturn(
                cellStatsTrackerMock);
        Mockito.when(trackerMock.getConfiguredTrafficProfiles())
                .thenReturn(
                        getFakeTrafficProfilesList());

        BatTrafficManagerStatsHelper btmStatsHelper = new BatTrafficManagerStatsHelper(date);
        String result = btmStatsHelper.getBtmString(TIME).replace("JsonDataForBatTrafficManagerRegex:", "");

        JsonParser parser = new JsonParser();
        assertEquals(parser.parse(result), parser.parse(EXPECTED_JSON_STR));
    }

}

Тестируемый оригинальный класс выглядит так:

public class BatTrafficManagerStatsHelper {

    private final Date date;

    /*
     * Constants for BAT Traffic Manager log parsing
     */
    private static final ImmutableMap<String, String> AHL_STATS_CONSTANTS_TO_BTM_CONSTANTS = ImmutableMap.of(
            BatAeroflexHLStatsConstants.RRC_CONNECTION_REQUEST_ATTEMPTS, "rrcConnectionAttempts",
            BatAeroflexHLStatsConstants.HANDOVER_ATTEMPTS, "handoverAttempts",
            BatAeroflexHLStatsConstants.SERVICE_REQ_MO_SUCCESS, "srMoSuccess",
            BatAeroflexHLStatsConstants.SERVICE_REQ_MT_SUCCESS, "srMtSuccess",
            BatAeroflexHLStatsConstants.ATTACH_SUCCESS, "attachSuccess");
    private static final String NUMBER_OF_UES = "numberOfUEs";

    /**
     * Constructor
     *
     * @param date
     */
    public BatTrafficManagerStatsHelper(Date date) {
        this.date = new Date(date.getTime());
    }

    /**
     * Extracts log data and returns it in a format suited
     * for parsing in {@literal BAT Traffic Manager}.
     *
     * @param elapsedTime
     * @return log data for BAT Traffic Manager
     */
    public String getBtmString(long elapsedTime) {
        MtsConfFactoryWrapper mtsConfFactoryWrapper = new MtsConfFactoryWrapper();
        Map<OptimizedRoute, List<StatsQueue>> ueGroupTracker = mtsConfFactoryWrapper.getConfBuilderr().getTracker()
                .getUeStatsTracker();
        Map<Enb, List<OptimizedCellStatsQueue>> cellTracker = mtsConfFactoryWrapper.getConfBuilderr().getTracker()
                .getCellStatsTracker();

        BatTrafficManagerStatsHelperJson json = new BatTrafficManagerStatsHelperJsonBuilder()
                .setDuration(elapsedTime)
                .setTimestamp(getTimeStamp())
                .setCellMetrics(getCellMetrics(cellTracker))
                .setTrafficProfileMetrics(getTrafficProfileMetrics(ueGroupTracker))
                .setUeGroupMetrics(getUeGroupMetrics(ueGroupTracker))
                .build();

        return "JsonDataForBatTrafficManagerRegex:" + getJsonString(json);
    }

}

public class MtsConfFactoryWrapper  {
    public MtsConfFactoryWrapper() {}

    public MtsConfBuilder getConfBuilderr() {
        return MtsConfFactory.getConfBuilder();
    }
}

1 Ответ

0 голосов
/ 11 февраля 2019

Используйте это в своем тестовом классе,

@Mock
private MtsConfFactoryWrapper mtsConfFactoryWrapper;

вместо

@Mock
private MtsConfFactoryWrapper mtsConfFactoryWrapper = new MtsConfFactoryWrapper();

Вы не должны назначать новый объект переменной mtsConfFactoryWrapper.Имитируемый объект будет присвоен переменной mtsConfFactoryWrapper при вызове MockitoAnnotations.initMocks(this);.

В вашем методе вы всегда создаете новый объект, как показано ниже:

MtsConfFactoryWrapper mtsConfFactoryWrapper = new MtsConfFactoryWrapper();

Таким образом, даже если вы высмеяли объект в своем тесте, при вызове метода он снова создаст новый объект.Попробуйте внедрить это в класс, а не создавать новый экземпляр внутри вашего метода.

Ваш класс должен выглядеть следующим образом:

public class BatTrafficManagerStatsHelper {

    private MtsConfFactoryWrapper mtsConfFactoryWrapper;

    public BatTrafficManagerStatsHelper(MtsConfFactoryWrapper mtsConfFactoryWrapper) {
        this.mtsConfFactoryWrapper = mtsConfFactoryWrapper;
    }

    // other stuffs
}

В вашем тестовом классе, когда вы создаете объект BatTrafficManagerStatsHelper, передайте ваш фиктивный объект конструктору, как показано ниже,

public class BatTrafficManagerStatsHelperTest {
    @Test
    public void testGetBtmString() throws Exception {
        //your code

        BatTrafficManagerStatsHelper btmStatsHelper = new BatTrafficManagerStatsHelper(passYourMockedObjectHere);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...