我有:
when(Long.valueOf(anyString())).thenReturn(anyLong());
在NumberFormatException
上获得Long.valueOf(String)
,因为“”正在传入。
我正在测试的代码是:
final Long id = Long.valueOf(foo.bar());
我怎样才能解决这个问题?
答案 0 :(得分:2)
这个请求是个坏主意。
您不能使用anyLong()
作为返回值。 Mockito matchers only stand in for argument values. Mockito需要准确知道要返回的值,但您可以选择任意值。
您无法使用Mockito存储静态方法。您只能存根对象实例,因为Mockito需要能够用自己的实现替换实现。您可以使用Powermock来存根静态方法,as listed in the Powermock documentation; Powermock使用类重写来秘密地将类替换为stub(Long
这里)。
即使您可以轻松替换Long.valueOf
,也没有多大意义。想象一下当Long.valueOf("5")
返回7时调试代码。
我的建议是使用一个代表您尝试做的事情的对象,然后嘲笑它。
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"));
}