我对自动化测试相当陌生,我在使用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
})
}
对此事的任何帮助都会非常感激,因为我不知道我在做什么。
答案 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);