2017-07-16 5 views
1

私はかなり自動化されたテストに慣れています。私はクラスをmockitoで嘲笑することにいくつかの問題を抱えています。基本的に私がやろうとしているのは、このメソッド(Request(Response))が呼び出されたときに、メソッドに送られているインターフェースを利用することです。mockitoを介在させて、 (コールバック.OnSuccess(Obj))。ここで私は私が必要とイマイチすべてを取り出してきた私の生産コードから始めますが、私が何を意味するかの例です:Mokito、Mockingメソッドの振る舞い

ServerRequestクラス

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

ResponseInterface

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

MainActivity

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

これまでのところ、私は複数の方法を試みました。次のコードに出てきますが、私はあなたが投稿からそれがうまくいかないと言うことができると確信していますが、私がやろうとしていることについて誰かによりよい考えを与えるかもしれないので、

ServerRequest mockReq = mock(ServerRequest.class); 
    Mockito.doAnswer(new Answer<Void>() { 
     @Override 
     public Void answer(InvocationOnMock invocation) throws Throwable { 
      System.out.println("Running first time"); 
      Object[] arguments = invocation.getArguments(); 
      ResponseInterface inter = (ResponseInterface) arguments[2]; 
      Object obj = "Already taken"; 
      inter.OnSuccess(obj); 
      return null; 
     } 
    }).when(mockReq).InformationRequest(ArgumentMatchers.anyMap(),anyString(),ArgumentMatchers.<ServerInterface>any()); 

私が何をしているのかわからないので、この問題についての助けを得ることができます。

+0

「RequestDataInterface」とは何ですか? 1 /あなたがテストコード(あなたが持っているもの)2をテストしたいコードと無関係なものをすべて削除してください。 –

+0

申し訳ありません私は早めに嘲笑していたし、元に戻すのを忘れてしまったので、私は今すべての問題を修正したと思います。 –

答えて

0

他の誰かが似たようなことを達成しようとしているのであれば、私は嘲笑されたメソッドを通してインターフェイスのメソッドを呼び出す方法を考え出しました。 私は前もって注釈をつけたセットアップメソッドを作成しました(必ずしも同じメソッドでテストの直前に置くことはできません)。それから、目標を達成するために必要なすべての設定を開始しました。ここではセットアップが必要です。私のテスト方法で

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