簡體   English   中英

當我嘗試編寫單元測試時出現斷言錯誤

[英]AssertionError when I try to write a unit test

我正在創建處理器來收集數據並在列表中提供它們。 但是當我嘗試為我的方法創建測試時,我發現了斷言錯誤。 我究竟做錯了什么?

我的課:

@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());
    }
}

堆棧跟蹤:

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 使用類ProcessorUtill靜態方法getAllData(jsonString) 為此,我使用了 powermock。

問題源於這樣一個事實,即您在TimeAdvanceDataStore data模擬上設置您的期望,但您正在測試的方法中創建TimeAdvanceDataStore的新實例。

由於您已經在使用 PowerMockito,您可以利用新對象創建,例如

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

最重要的是,想想你的應用程序中有多少 ZTEProcessor 和 TimeAdvanceDataStores。 您是否總是希望在每次調用 getTA 時都有一個新的 TimeAdvanceDataStore 實例?

如果沒有,只需在構造函數中傳遞 TimeAdvanceDataStore。

如果是,當您無法使用 PowerMockito 時,常用的方法是:

  • 將 TimeAdvanceDataStore 的工廠傳遞給 ZTEProcessor 構造函數
  • 將 TimeAdvanceDataStore 傳遞給 getTA 方法
  • 提取構造 TimeAdvanceDataStore 的方法並在測試中覆蓋它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM