如何模拟ObjectMetadata对象

时间:2017-11-23 10:46:54

标签: java unit-testing junit junit4 powermock

我有以下方法:

private boolean success(String key) {
    if (cachedStatus.containsKey(key)) {
      return cachedJobsStatus.get(key).booleanValue();
    }
    String status = String.format("%s/%s", key, SUCCESS);
    ObjectMetadata meta = getMetadata(key);
    Boolean isOK = Boolean.FALSE;
    if (meta != null) {
      isOK = Boolean.TRUE;
   }
    cachedStatus.put(objectKey, isOK);
    return isOK.booleanValue();
}

我创建了这个测试:

public void successTest() throws Exception {
    String key = "data1-1-33-a.txt/part-00002-attempt_201711232056_0000_m_000002_2";

    //test when _SUCCESS exists
    boolean result = Whitebox.invokeMethod(APIClient, "success", key);
    Assert.assertEquals("successuccessful() failed even when _SUCCESS exists",
        true, result);

我认为测试失败了因为meta永远不存在所以isOK没有设置为true。

为了让测试正常工作,我想我必须为meta创建一个模拟,但我不确定如何。有人可以建议吗?

这是getMetadata()方法:

protected ObjectMetadata getMetadata(String key) {
    try {
      ObjectMetadata m = client.getMetadata(bucket, key);
      return m;
    } catch (AmazonClientException e) {
      LOG.warn(e.getMessage());
      return null;
    }
}

1 个答案:

答案 0 :(得分:0)

最简单的方法可能是模仿你的client

@RunWith(MockitoJUnitRunner.class)
public class MyTest {

   @Mock
   private AmazonS3Client client;   // or whatever

   @Mock
   private ObjectMetadata mockedObjectMetadata;

   @InjectMocks
   private MyClassToTest toTest; // Put your class that has "client" here

   @Test
   public void someTest() {
       Mockit.when(client.getMetadata(Mockito.anyString(), Mockito.anyString()).thenReturn( mockedObjectMetadata ); // voila

       boolean result = toTest("someRandomKey");
       ///etc.
   }

}