Просто для продолжения этого вопроса это можно сделать с помощью 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 имеет некоторые недостатки. Как правило, он будет использовать больше памяти и больше времени, поэтому ваш тест будет работать дольше. Для этого конкретного теста это не будет иметь большого значения, но просто как голова.