Mokito,Mocking方法行为

时间:2017-07-16 17:04:19

标签: java android mockito

我对自动化测试相当陌生,我在使用mockito模拟一个类时遇到了一些麻烦。基本上我正在尝试做的是使用正在发送给方法的接口,当调用此方法(请求(响应))时,我希望mockito进行干预并从接口调用方法将对象作为参数传递(callback.OnSuccess(的OBJ))。这是我的意思的一个例子,我将从我的生产代码开始,我已经取出了所有不需要的东西:

ServerRequest类

$data = file_get_contents("list.txt");

Preg_match_all("/([0-9A-Fa-f:-]{17})/", $data, $macs);

File_put_contents("result.txt", implode(PHP_EOL, $macs[1]));

ResponseInterface

public void Request(ResponseInterface callback){
 //The contents of this class isnt really important as I do not wish to use any of it
//but in general this makes a request to the server and if the request is a success then
Object obj = ProcessResponse(Response);
callback.OnSuccess(obj);
//otherwise
Object obj = ProcessResponse(Response);
callback.OnError(obj);
}

MainActivity

public interface ResponseInterface(){
void OnSuccess(Object resp);
void OnError(Object resp);
}

到目前为止,我已经尝试了多种方法,我能想出的最好的方法是在下面的代码中,但是我确信你可以从帖子中看出它没有用,但是我会留在这里,因为它可能会给某人更好地了解我想要做的事情。

public void MakeRequest(){
ServerRequest.Request(new ResponseInterface(){
@Override
public void OnSuccess(Object objResponse){
 //do something to show user the request was successful depending on the current activity
}

@Override
public void OnError(String e){
 //do something depending on the current activity
})
}

对此事的任何帮助都会非常感激,因为我不知道我在做什么。

1 个答案:

答案 0 :(得分:0)

如果其他任何人试图实现类似的东西,我已经想出如何在通过模拟方法发送的接口中调用该方法。 所以首先我创建了使用before注释的setup方法(不一定需要你可以在测试之前将它放在同一个方法中)。然后我开始设置实现目标所需的一切,这里是需要的设置。

//class to be mocked
@Mock
ServerRequest mockReq;

@Before
public void setup(){
    //get the activity instance
    Registration reg = mActivityRule.getActivity();
    //make sure the actual method to be mocked does nothing, By default it should do nothing anyway but for some reason  not for me 
    doNothing().when(mockReq).InformationRequest(ArgumentMatchers.anyMap(),anyString(),ArgumentMatchers.<ServerInterface>any());
    //set up an argument catcher
    captor = ArgumentCaptor.forClass(ServerInterface.class);
    //inject the mock into the activity
    reg.serverRequest = mockReq;
}

接下来在我的测试方法中,单击提交按钮时应调用模拟方法,在这种情况下,我验证实际调用了模拟方法并捕获发送给它的数据,然后我以任何方式使用数据我希望。

 //click the button
 onView(withId(R.id.SubmitBtn)).perform(scrollTo(), click());
 //check to see if method was called then capture the interface
 verify(mockReq).InformationRequest(ArgumentMatchers.anyMap(),anyString(),captor.capture());
  //get the interface
 ServerInterface serverInter = captor.getValue();
 Object obj = "Already taken";
 //make use of the interface
 serverInter.OnSuccess(obj);