【问题标题】:Is it possible to initialize some of the fields in a mock object是否可以初始化模拟对象中的某些字段
【发布时间】:2020-11-24 15:46:08
【问题描述】:

我有一段代码无法通过测试正确覆盖。 我正在使用 Mockito 库。 而且我在开始测试的那一刻遇到了困难。

下面是测试代码:

@Test
public void testLoadCar() {
    when(remoteService.loadData()).thenReturn(new DataResult<DataCar>("", "", new DataCar()));
    when(dataResult.hasError()).thenReturn(true);
    when(dataResult.response.hasHeaders()).thenReturn(true);
    requestNetwork = new RequestNetwork(remoteService);
    Response<DataCar> response = requestNetwork.load(request);
}

这些是测试类中的对象:remoteService、dataResult、request。

我担心我尝试实现 when 方法的那一刻:

when(dataResult.response.hasHeaders()).thenReturn(true);

我想知道这样的录音是否有效。 如果它不起作用,那么我们该如何处理这个时刻:

protected Response createResponse(DataResult<T> dataResult) {
    if (dataResult.hasError()  || !dataResult.response.hasHeaders()) {
        return dataResult.getErrorMessage());
    } else {
        return Response.data(dataResult.value);
    }
}

这是被测系统 (SUT) 上具有 createResponse() 方法的方法。此方法包含对 DataResult 对象的模拟方法的调用。 实现 dataResult.hasError() 我明白了:

when (dataResult.hasError ()). thenReturn (true);

然后! DataResult.response.hasHeaders() 我有问题。因为我不明白如何替换我需要的值。

【问题讨论】:

    标签: java android testing junit mockito


    【解决方案1】:

    并非所有与您的被测对象交互的对象都需要模拟。 请记住,您也可以使用 POJO。

    DataResult 看起来是 POJO 的完美候选人。 如果您可以创建具有所需状态和行为的 POJO,那么使用模拟对象将一无所获。

    看贴出来的代码,好像很容易创建:

    new DataResult<DataCar>("", "", new DataCar())
    

    最重要的是:

    你的代码在我看来很可疑。

    • 当存根remoteService.loadData() 时,您会创建DataResult 的新实例
    • 随后,您对dataResult 的一些调用存根,这不是从remoteService.loadData() 返回的对象

    并回答原帖:

    您可以在模拟上设置字段(如果访问修饰符允许则直接设置字段,否则通过反射设置)。请注意,这是对模拟的非常不习惯和令人惊讶的使用。

    class A {
        B b;
    }
    
    class B {
        boolean hasHeaders() {
            return true;
        }
    }
    
    @ExtendWith(MockitoExtension.class)
    public class AAATest {
    
        @Mock
        A aMock;
    
        @Mock
        B bMock;
    
        @BeforeEach
        void setupMocks() {
            aMock.b = bMock;
        }
    
        @Test
        void testFieldInMockIsInitialized() {
            Assertions.assertEquals(bMock, aMock.b);
        }
    }
    

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多