Mockito测试-getHeaders()无法返回SimpMessageHeaderAccessor,getHeaders()应该返回MessageHeaders

时间:2019-01-18 11:48:20

标签: java spring unit-testing testing mockito

如何编写单元测试,因为它包括内部调用其他方法。

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.此错误可能发生在错误编写的多线程测试中。请参考Mockito常见问题的并发限制   测试。   2.使用when(spy.foo())。then()语法对间谍进行打桩。对间谍进行存根比较安全-      -使用doReturn | Throw()系列方法。有关Mockito.spy()方法的更多Javadocs。

消息是一个接口,我将其作为实例进行模拟,但它根本无法获取标头,它是一个模拟...我该如何解决此问题。

1 个答案:

答案 0 :(得分:1)

您不能使用香草嘲笑来模拟静态方法。

我建议在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进行间谍才能模拟受保护的方法。