【问题标题】:Mockito - mocking RestOperationsMockito - 模拟 RestOperations
【发布时间】:2012-04-19 21:33:06
【问题描述】:

我有:

Map<String, String> vars = new HashMap<String, String>();
String r = restOperations.getForObject(url, String.class, vars);

在我的测试中,我尝试模拟 RestOperations:

@Mock
RestOperations restOperations;

when(restOperations.getForObject(Matchers.anyString(), Matchers.eq(String.class), Matchers.notNull())).thenReturn("ok");

这永远不会被触发。

有人知道为什么吗?

【问题讨论】:

    标签: java spring unit-testing mocking mockito


    【解决方案1】:

    我认为问题在于方法重载。 getForObject 有两个采用三个参数的重载版本:

    <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables);
    
    <T> T getForObject(String url, Class<T> responseType, Object... uriVariables);
    

    当你想模拟第一个时,你实际上是在模拟第二个。为了帮助静态方法解析强制转换 notNull() 显式匹配:

    when(restOperations.getForObject(
      Matchers.anyString(), Matchers.eq(String.class), (Map)Matchers.notNull())
    ).thenReturn("ok");
    

    或者更好的是,使用anyMap()

     when(restOperations.getForObject(
       Matchers.anyString(), Matchers.eq(String.class), Matchers.anyMap())
     ).thenReturn("ok");
    

    【讨论】:

    • 更好:when(restOperations.getForObject( Matchers.anyString(), Matchers.eq(String.class), Matchers.anyMapOf(String.class, String.class)) ).thenReturn("ok"); 非常感谢!
    • 请注意,mamruoc 的 sn-p 仅适用于 Mockito 1.9.0 及更高版本。
    【解决方案2】:

    感谢您的回答,真的很有帮助。

    以下是完整的源代码,觉得对其他人有帮助。

    public class HandlerTest {
    
        private Handler handler;
    
        @Before
        public void setUp() {
            handler = new HandlerImpl();
        }
    
        @Test
        public void testMethodtoTest() {
            String param1 = "123456";
            String param2 = "3736272";
            String param3 = "838912";
    
            RestTemplate mock = Mockito.mock(RestTemplate.class);
            Mockito.when(mock.getForObject( Matchers.anyString(), Matchers.eq(String.class), Matchers.anyMapOf(String.class, String.class)) ).thenReturn("ok");
            handler.setRestTemplate(mock);
    
            String actualResponse = handler.MethodtoTest(param1, param2, param3);
    
            Assert.assertNotNull(actualResponse);
            Assert.assertEquals("ok",actualResponse);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2014-06-16
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2021-08-07
      相关资源
      最近更新 更多