1

例外時に異なるパラメーターで再試行する関数をテストしています。以下は疑似コードです。

class Myclass {
 public void load(input)
  try {
   externalAPI.foo(input);
 } catch(SomeException e) {
   //retry with different parameters
   externalAPI.foo(input,input2);
 }

外部 API をモックして、junit を使用して上記のコードをテストするにはどうすればよいですか。

@Test
public void testServiceFailover(){

    m_context.checking(new Expectations() {{
        allowing (mockObjExternalAPI).foo(with(any(String.class)));
        will (throwException(InvalidCustomerException));
        allowing (mockObjExternalAPI).foo(with(any(String.class),with(any(String.class)));
        will (returnValue(mockResult));
    }});
}

しかし、上記のテストは、「例外をスローしないメソッド (foo() から) から SomeException をスローしようとした」と言って失敗します。しかし実際には、メソッド foo はそのメソッド シグネチャで SomeException に言及しています。

関数fooのjunitをどのように書くことができますか?

4

1 に答える 1

1

Mockitoでは、次のようにします: ...

private ExternalAPI mockExternalAPI;
private MyClass myClass;

@Before
public void executeBeforeEachTestCase()
{
   mockExternalAPI = Mockito.mock(ExternalAPI.class);
   //Throw an exception when mockExternalAPI.foo(String) is called.
   Mockito.doThrow(new SomeException()).when(mockExternalAPI).foo(Mockito.anyString());

   myClass = new MyClass();
   myClass.setExternalAPI(mockExternalAPI); 
} 

@After
public void executeAfterEachTestCase()
{
  mockExternalAPI = null;
  myClass = null;
}

@Test
public void testServiceFailover()
{

   myClass.load("Some string);

   //verify that mockExternalAPI.foo(String,String) was called.
   Mockito.verify(mockExternalAPI).foo(Mockito.anyString(), Mockito.anyString());   
}
于 2012-09-21T09:47:34.460 に答える