Тест Mockito - SimpMessageHeaderAccessor не может быть возвращен getHeaders () getHeaders () должен вернуть MessageHeaders - PullRequest
0 голосов
/ 18 января 2019

Как написать модульный тест, потому что он включает внутренний вызов другого метода.

public class MyService implements UserDestinationResolver {

    @Override
    public UserDestinationResult myMethod(Message<?> message){
    SimpMessageHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, SimpMessageHeaderAccessor.class);

****some logics to use access to get the return value UserDestinationResult***

    return UserDestinationResult;

getAccessor - это статический метод из класса MessageHeaderAccessor

@Nullable
public static <T extends MessageHeaderAccessor> T getAccessor(Message<?> message, Class<T> requiredType) {
        return getAccessor(message.getHeaders(), requiredType);
    } 

вот мой тестовый пример:

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {

    @Mock
    private Message<?> message;

    private SimpMessageHeaderAccessor accessor;

    @Mock
    private UserDestinationResult userDestinationResult;

    @InjectMocks
    private MyService myService;

    @Before
    public void set_up(){
        accessor = SimpMessageHeaderAccessor.wrap(message);
    }

    @Test
    public void resolveDestination(){
    when(MessageHeaderAccessor.getAccessor(message,
                SimpMessageHeaderAccessor.class)).thenReturn(accessor);

    """""""""""""""""""""""""""""""
    assertEquals(excepted, actual);
}

Ошибка происходит:

SimpMessageHeaderAccessor не может быть возвращен getHeaders () getHeaders () должен вернуть MessageHeaders Если вы не уверены, почему получаете ошибку выше, читайте дальше. Из-за Природа синтаксиса выше проблемы может возникнуть из-за: 1. Это исключение может возникнуть в неправильно написанных многопоточных тестах. Пожалуйста, обратитесь к FAQ по ограничениям параллелизма. тестирование. 2. Шпион заглушается с использованием синтаксиса when (spy.foo ()). Then (). Безопаснее шпионить шпионов - - с помощью семейства методов doReturn | Throw (). Больше в javadocs для метода Mockito.spy ().

Сообщение - это интерфейс, я его высмеиваю как пример, но он вообще не может получить заголовки, это издевательство ... как я могу решить эту проблему ...

1 Ответ

0 голосов
/ 18 января 2019

Нельзя высмеивать статический метод с помощью ванильного мокито.

Я бы предложил создать защищенный метод в MyService, который бы обернул статический вызов, а затем высмеял его:

public class MyService implements UserDestinationResolver {

    @Override
    public UserDestinationResult myMethod(Message<?> message){
    SimpMessageHeaderAccessor accessor = getAccessor(message, SimpMessageHeaderAccessor.class);
     ...
    }

    protected SimpMessageHeaderAccessor getAccessor(Message<?> message, Class<T> requiredType){
         return SimpMessageHeaderAccessor.getAccessor(message, SimpMessageHeaderAccessor.class);
    }

Затем в тесте:

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {

    @Mock
    private Message<?> message;


    @Mock
    private UserDestinationResult userDestinationResult;

    @InjectMocks
    @Spy
    private MyService myService;

    @Before
    public void set_up(){
        accessor = SimpMessageHeaderAccessor.wrap(message);
    }

    @Test
    public void resolveDestination(){
       // Arrange
       doREturn(accessor).when(myService).getAccessor(message,
                SimpMessageHeaderAccessor.class));

      ....
}

Изменение заключается в том, что вам нужно шпионить за MyService, чтобы иметь возможность смоделировать защищенный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...