只要對此問題進行跟進,就可以通過PowerMock完成。
作爲提取物,這是我的工作代碼:
@RunWith(PowerMockRunner.class)
@PrepareForTest({MyClass.class, MessageDigest.class})
public class MyClassTest {
private MyClass myClass = new MyClass();
@Mock private MessageDigest messageDigestMock;
@Test
public void shouldDoMethodCall() throws Exception {
setupMessageDigest();
String value = myClass.myMethodCall();
// I use FestAssert here, you can use any framework you like, but you get
// the general idea
Assertions.assertThat(value).isEqualToIgnoringCase("hashed_value");
}
public void setupMessageDigest() throws Exception {
PowerMockito.mockStatic(MessageDigest.class);
when(MessageDigest.getInstance("SHA1")).thenReturn(messageDigestMock);
when(messageDigestMock.digest(Matchers.<byte[]>anyObject())).thenReturn("hashed_value".getBytes());
}
}
類 「MyClass的」 只會做這樣的事情:
public class MyClass {
public String myMethodCall() {
return new String(MessageDigest.getInstance("SHA1").digest("someString".getBytes()));
}
}
在額外的測試,你可以寫
when(MessageDigest.getInstance("SHA1")).thenThrow(new NoSuchAlgorithmException());
而不是我提到的回報,去你的catch塊。
但請注意,使用PowerMock有一些缺點。它通常會使用更多的內存和更多的安裝時間,因此您的測試將運行更長時間。對於這個具體的測試,它不會有很大的不同,但是就像一個人的頭。