java—是否可以初始化模拟对象中的某些字段

3df52oht  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(282)

我有一个代码,我不能正确涵盖测试。我正在使用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对象的mock方法的调用。为了实现dataresult.haserror(),我得到了:

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

那就用!dataresult.response.hasheaders()我有个问题。因为我不知道如何替换我需要的值。

70gysomp

70gysomp1#

并不是所有与测试对象交互的对象都需要模拟。记住你也可以使用pojo。 DataResult 看起来是个完美的pojo候选人。如果可以创建具有所需状态和行为的pojo,那么使用mock objet将一无所获。
查看发布的代码,似乎很容易创建:

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

除此之外:
我觉得你的代码可疑。
拔桩时 remoteService.loadData() 创建的新示例 DataResult 随后,您在 dataResult ,它不是从返回的对象 remoteService.loadData() 回复原文:
可以在mock上设置字段(如果访问修饰符允许,可以直接设置,否则可以通过反射设置)。请注意,这并不是非常惯用和令人惊讶的mock用法。

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

相关问题