AssertionError, когда я пытаюсь написать модульный тест - PullRequest
0 голосов
/ 11 марта 2020

Я создаю процессор для сбора данных и предоставления их в список. Но когда я пытаюсь создать тест для моего метода, я ловлю assertionerror. Что я делаю не так?

Мой класс:

@AllArgsConstructor
public class ZteProcessor implements OurProcessor {

    private final static String VENDOR = "ZTE";

    private String jsonString;
    private Map<String, String> metricsGU;
    private Map<String, String> metricsUMTS;
    private Map<String, String> metricsLTE;

    @Override
    public List<TimingAdvance> getTA() throws ParseException, NotFoundPatternOrMetricsException {
        TimeAdvanceDataStore data = new TimeAdvanceDataStore();
        AllDataFromJSONFile fromJSONFile = ProcessorUtil.getAllData(jsonString);
        if (jsonString.contains("String")) {
            return data.allDataToTimingAdvance(VENDOR, fromJSONFile, metricsGU, 2);
        } else if (jsonString.contains("String-2")) {
            return data.allDataToTimingAdvance(VENDOR, fromJSONFile, metricsUMTS, 3);
        } else if (jsonString.contains("String3")) {
            return data.allDataToTimingAdvance(VENDOR, fromJSONFile, metricsLTE, 4);
        } else {
            throw new NotFoundPatternOrMetricsException();
        }
    }
}

Мой тест:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ProcessorUtil.class})
public class ZteProcessorTest {

    @Mock
    private AllDataFromJSONFile fromJSONFile;
    @Mock
    private TimeAdvanceDataStore data;

    private OurProcessor processor;

    private TimingAdvance timingAdvance = new TimingAdvance();

    private Map<String, String> metricsGU = new HashMap<>();
    private Map<String, String> metricsUMTS = new HashMap<>();
    private Map<String, String> metricsLTE = new HashMap<>();

    @Test
    public void getTATest() throws Exception {
        String jsonString = " { String : value}";
        processor = new ZteProcessor(jsonString, metricsGU, metricsUMTS, metricsLTE);
        List<TimingAdvance> list = new ArrayList<>();
        list.add(timingAdvance);
        PowerMockito.mockStatic(ProcessorUtil.class);

        when(ProcessorUtil.getAllData(jsonString)).thenReturn(fromJSONFile);
        when(data.allDataToTimingAdvance(jsonString, fromJSONFile, metricsGU, 2)).thenReturn(list);
        assertEquals(list, processor.getTA());
    }
}

Stacktrace:

java.lang.AssertionError: 
Expected :[TimingAdvance{filial='null', vendor='null', cellName='null', periodDate=null, taMetrics=null}]
Actual   :[]
<Click to see difference>


    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)

Мой ZteProcessor использует метод stati c getAllData(jsonString) класса ProcessorUtill. И для этого я использую powermock.

1 Ответ

0 голосов
/ 16 марта 2020

Проблема связана с тем, что вы устанавливаете свои ожидания на макете TimeAdvanceDataStore data, но вы создаете новый экземпляр TimeAdvanceDataStore в тестируемом методе.

Поскольку вы уже используете PowerMockito, вы можете подключиться к созданию нового объекта, например

PowerMockito.whenNew(TimeAdvanceDataStore.class)
            .withAnyArguments().thenReturn(data);

. Кроме того, подумайте, сколько ZTEProcessors и TimeAdvanceDataStores у вас есть в вашем приложении. Вы всегда хотите новый экземпляр TimeAdvanceDataStore в каждом вызове getTA?

Если нет, просто передайте TimeAdvanceDataStore в конструкторе.

Если да, то общие подходы, когда PowerMockito не в вашем распоряжении, :

  • передача фабрики TimeAdvanceDataStore в конструктор ZTEProcessor
  • передача TimeAdvanceDataStore в метод getTA
  • извлечение метода, создающего TimeAdvanceDataStore, и переопределение его в тесте
...