简体   繁体   English

当我尝试编写单元测试时出现断言错误

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

I'm creating the processor to collect data and provide them in list.我正在创建处理器来收集数据并在列表中提供它们。 But when I'm trying to create test for my method i'm catching assertionerror.但是当我尝试为我的方法创建测试时,我发现了断言错误。 What am I doing wrong?我究竟做错了什么?

My Class:我的课:

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

My Test:我的测试:

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

My ZteProcessor using static method getAllData(jsonString) of class ProcessorUtill .我的 ZteProcessor 使用类ProcessorUtill静态方法getAllData(jsonString) And for it I use powermock.为此,我使用了 powermock。

The problem stems from the fact that you are setting your expectations on a TimeAdvanceDataStore data mock, but you are creating a new instance of TimeAdvanceDataStore in your method under test.问题源于这样一个事实,即您在TimeAdvanceDataStore data模拟上设置您的期望,但您正在测试的方法中创建TimeAdvanceDataStore的新实例。

Since you are already using PowerMockito, you can tap into new object creation like由于您已经在使用 PowerMockito,您可以利用新对象创建,例如

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

On top of that, think how many ZTEProcessors and TimeAdvanceDataStores you have in your app.最重要的是,想想你的应用程序中有多少 ZTEProcessor 和 TimeAdvanceDataStores。 Do you always want a new instance of TimeAdvanceDataStore in each call to getTA?您是否总是希望在每次调用 getTA 时都有一个新的 TimeAdvanceDataStore 实例?

If not, just pass TimeAdvanceDataStore in a constructor.如果没有,只需在构造函数中传递 TimeAdvanceDataStore。

If yes, common approaches when PowerMockito is not at your disposal are:如果是,当您无法使用 PowerMockito 时,常用的方法是:

  • passing a factory of TimeAdvanceDataStore to ZTEProcessor constructor将 TimeAdvanceDataStore 的工厂传递给 ZTEProcessor 构造函数
  • passing TimeAdvanceDataStore to getTA method将 TimeAdvanceDataStore 传递给 getTA 方法
  • extracting a method constructing TimeAdvanceDataStore and overriding it in test提取构造 TimeAdvanceDataStore 的方法并在测试中覆盖它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 执行单元测试时出现java.lang.AssertionError - java.lang.AssertionError when executing unit test 当我尝试调试单个单元测试时,IntelliJ IDEA 运行完整的测试套件 - IntelliJ IDEA runs full test suite when I try to debug a single unit test 如何使用 mockito 模拟和编写 try 和 catch 块的单元测试 - How to mock and write unit test for try and catch block using mockito 使用我自己的模型作为参数执行单元测试时出现 java.lang.AssertionError - java.lang.AssertionError when executing unit test when using my own model as parameter AndroidStudio:当我尝试在单元测试 class 中初始化 JSONObject 时,它总是输出 null - AndroidStudio: when I try to initialize a JSONObject in Unit test class it always outputs null 如何编写数据库单元测试? - How do I write a database unit test? AssertionError单元测试时发生意外的方法调用 - AssertionError Unexpected method call when unit testing 我在尝试进行单元测试时收到 java.lang.AssertionError: Status expected:&lt;200&gt; but was:&lt;401&gt; - I'm getting a java.lang.AssertionError: Status expected:<200> but was:<401> when trying to do unit tests 单元测试:我应该为分支还是被调用的方法编写测试? - Unit Test: Should I write test for branch or called methods? 如何编写单元测试? - How to write a Unit Test?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM