如何在Mockito中存根Long.valueOf(String)?

时间:2014-07-23 17:54:20

标签: mocking mockito

我有:

when(Long.valueOf(anyString())).thenReturn(anyLong());

NumberFormatException上获得Long.valueOf(String),因为“”正在传入。

我正在测试的代码是:

 final Long id = Long.valueOf(foo.bar()); 

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

这个请求是个坏主意。

  1. 您不能使用anyLong()作为返回值。 Mockito matchers only stand in for argument values. Mockito需要准确知道要返回的值,但您可以选择任意值。

  2. 您无法使用Mockito存储静态方法。您只能存根对象实例,因为Mockito需要能够用自己的实现替换实现。您可以使用Powermock来存根静态方法,as listed in the Powermock documentation; Powermock使用类重写来秘密地将类替换为stub(Long这里)。

  3. 即使您可以轻松替换Long.valueOf,也没有多大意义。想象一下当Long.valueOf("5")返回7时调试代码。

  4. 我的建议是使用一个代表您尝试做的事情的对象,然后嘲笑它。

    class SystemUnderTest {
      class IdExtractor {
        long extractIdFromString(String string) {
          return Long.valueOf(string);
        }
      }
    
      IdExtractor idExtractor = new IdExtractor();
    
      public boolean reticulateSplines(String input) {
        long id = idExtractor.extractIdFromString(input);
        // ...
      }
    }
    
    @Test public void reticulateSplinesShouldWork() {
      SystemUnderTest systemUnderTest = new SystemUnderTest();
      IdExtractor mockIdExtractor = mock(SystemUnderTest.IdExtractor.class);
      systemUnderTest.idExtractor = mockIdExtractor;
    
      when(mockIdExtractor.extractIdFromString(anyString())).thenReturn(42L);
      assertTrue(systemUnderTest.reticulateSplines("blah"));
    }