2015-12-08 2 views
4

У меня есть интерфейс, какMock статический метод вызова в методе по умолчанию в Java 8 интерфейса

public interface WithMD5Calculator{ 

    default String getMd5(){ 
     try{ 
      MessageDigest md = MessageDigest.getInstance("MD5"); 
      //... not important 
     }catch(NoSuchAlgorithmException e){ 
      //... do some extra stuff and throw wrapped in ServiceException 
     } 
    } 

    // rest of code not important 
} 

И тест, который должен проверить обработку исключений:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MessageDigest.class) 
public class WithMD5Calculator{ 

    @Test 
    public void shouldHandleNSAEx(){ 
     PowerMockito.mockStatic(MessageDigest.class); 
     Mockito.when(MessageDigest.getInstance("MD5")).thenThrow(new NoSuchAlgorithmException("Throwed")); 

     WithMD5Calculator sut = new WithMD5Calculator(){}; 
     ExceptionAssert.assertThat(()-> sut.getMd5()) 
      .shouldThrow(ServiceException.class); 
     // some more checks 
    } 
} 

Но ServiceException не забросил. Похоже, MessageDigest.getInstance не издевались.

Любая идея?

+0

'проверка' может быть полезна, если я хочу проверить, вызван метод или более общее поведение статического класса. В моем случае мне не нужно проверять поведение, а изменять поведение метода. –

+0

Идея: при использовании PowerMockito для издевательства над этим методом вы можете использовать PowerMockito для наложения этого метода (например, PowerMockito.when (...). ThenThrow (...)). Как Мокито должен знать, что вы вызвали статический метод? – xmjx

+0

Метод 'when' от PowerMockito - это просто оболочка для' when' из библиотеки Mockito. «Магия» PowerMockito заключается в том, что он готовит класс со статикой, по аннотации '@ PrepareForTest',« макет »от Mockito. –

ответ

0

Добавить WithMD5Calculator в список PrepareForTest может решить вашу проблему.

Смежные вопросы