如何编写单元测试,因为它包括内部调用其他方法。
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。
消息是一个接口,我将其作为实例进行模拟,但它根本无法获取标头,它是一个模拟...我该如何解决此问题。
答案 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进行间谍才能模拟受保护的方法。