繁体   English   中英

如何在测试中从私有方法的返回值中获取值

[英]How to get value from a private method's return value in test

我正在尝试为以下场景编写测试。 我想模拟那个 restCallReturningAString() 方法调用。

现在我可以执行以下操作。

when(restCallReturningAString(any()).thenReturn("some text String");

但我希望能够传递一个实际值,而不是仅仅使用 any()。

我不能只在我的测试方法中创建一个新的请求 object 因为它不匹配。 这是因为没有 Object 等于请求 Object 和其中的其他对象的覆盖。 为了测试,我不想添加等于覆盖。

如何捕获请求 object 的值,以便能够在我的测试中使用它? 我不熟悉 ArgumentCapture 并试图看看这是否会对此有所帮助,但没有运气。 感谢任何帮助。 我只想坚持使用 Mockito 版本 1.10。 我不想为此使用 PowerMock 或任何其他库。 谢谢。

Class 正在测试

public class SomeClass {

    @Autowired
    private AnotherClass anotherClass;

    public String getData(String name){
        ExternalData externalData = new ExternalData();
        List<InnerObject> innerObjects = Collections.singletonList(new InnerObject());
        externalData.setInnerObjects(innerObjects);

        // Question is how do I capture the value of request here? 
        Request request = getRequest(externalData, name);

        String s = anotherClass.restCallReturningAString(request);
        //other logic
        return "some String";
    }

    private Request getRequest(ExternalData externalData, String name){
        // other logics
        Request request = new Request();
        request.setName(name);
        request.setExternalData(externalData);
        return request;
    }
}

// all following classes in their own separate files

@Getter
@Setter
class Request {
    private String name;
    private ExternalData externalData;
}

@Getter
@Setter
class ExternalData {
    private String color;
    private List<InnerObject> innerObjects;
}

@Getter
@Setter
class InnerObject {
    private String name;
} 

如果我可以捕获该值,请尝试按如下方式进行测试:

@Test
public void someTest(){
    // This is the issue. Looking to be able to capture this value
    Request request = // got the value with a solution

    when(anotherClass.restCallReturningAString(request)).thenReturn("some test text");
    // instead of
    // when(anotherClass.restCallReturningAString(any())).thenReturn("some test text");

    String s = someClass.getData("name");
    assertEquals("expected", s);
}

正如我在评论中所写:您可以使用 ArgumentCaptor 来捕获传递给您的方法的值。 然后,您可以验证传递的参数是否正确。

示例代码:

@Test
public void someTest(){
    ArgumentCaptor<Request> requestArgumentCaptor = ArgumentCaptor.forClass(Request.class);
    when(anotherClass.restCallReturningAString(requestArgumentCaptor.capture())).thenReturn("some test text");

    String s = someClass.getData("name");
    assertEquals("expected", s);

    //  verify that the method was called only once
    assertEquals(1, requestArgumentCaptor.getAllValues().size());

    // verify the restCallReturningAString method was called with the correct values for request
    assertEquals("expectedName", requestArgumentCaptor.getValue().getName());
    assertEquals("expectedColor", requestArgumentCaptor.getValue().getExternalData().getColor());
    // and so on
}

窥探目标测试 class 并像这样编写测试用例:

@Test
public void someTest(){
    // Arrange
    SomeClass spyClass = spy(someClass);
    Request request = // got the value with a solution;
    when(spyClass.getRequest(externalData, name)).thenReturn(request);
    when(anotherClass.restCallReturningAString(request)).thenReturn("some test text");

    // Act
    String actual = spyClass.getData("name");

    // Assert
    assertEquals("expected", actual);
}

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM