Если бы код был именно тем, который вы опубликовали, Mockito было бы недостаточно: вам понадобится PowerMockito.
@RunWith(PowerMockRunner.class)
@PrepareForTest({MyClass.class})
public class MyTest{
Map<String, Object> hashMap;
@Before
public void setUp() throws Exception {
hashMap = Mockito.spy(new HashMap<>());
PowerMockito.whenNew(HashMap.class).withAnyArguments().thenReturn((HashMap) hashMap);
}
/**
* Test of doSomething method, of class MyMap.
*/
@Test
public void testDoSomething() {
MyClass myClass = new MyClass();
myClass.funcName();
Mockito.verify(hashMap).put(Mockito.anyString(), Mockito.any());
}
}
Использование PowerMockito
действительно необходимо, когда у вас возникают проблемы с тестируемостью о:
- Личные методы
- Стати c Методы
- Финальный или личный класс
- Конструкторы
Но PowerMockito
никогда не является чистым решением: всегда лучше избегать его использования ; кроме того, используя инъекционные светодиоды для лучшего дизайна.
Иногда бывает даже меньше: если бы ваш код был примерно таким:
public void funcName(Map<String, Object> map){
// something here
map.put("", obj);
// other stuff
}
В этом не было бы необходимости PowerMockito
:
public class MyTest{
Map<String, Object> hashMap;
@Before
public void setUp() throws Exception {
hashMap = Mockito.spy(new HashMap<>());
}
/**
* Test of doSomething method, of class MyMap.
*/
@Test
public void testDoSomething() {
MyClass myClass = new MyClass();
myClass.funcName(hashMap);
Mockito.verify(hashMap).put(Mockito.anyString(), Mockito.any());
}
}