我有以下方法:
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;
}
}
答案 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.
}
}