我有以下类(class):
public class DaoService {
private Dao dao;
private Map<String, Entity> map;
public DaoService(Dao dao, Map<String, Entity> map){
this.dao = dao;
this.map = map;
}
public create(Entity entity){
Dao.create(entity);
map.put(Entity.getName(), entity);
}
}
我想测试方法调用是否真的在映射中放置了一个新元素,当我用另一个参数调用它时,它的大小将等于 2。但我需要忽略 Dao.create()。
我有以下测试类:
@RunWith(MockitoJUnitRunner.class)
public class DaoServiceTest {
@Mock
Dao dao;
@Mock
Map<String, Entity> map = new HashMap<>();
@InjectMocks
DaoService service;
@Test
public void testCreate(){
Entity entity = new Entity("Alex"); // name
service.create(entity);
assertEquals(map.size(),1); // failNotEquals
}
当我调用 service.create(entity)
时我该怎么做,它将忽略 dao.create(entity)
但不会忽略 map.put (entity.getName(), 实体)
?
最佳答案
问题是你用 @Mock
注释了 map
所以你是在模拟上调用 map.size()
,而不是在你分配给 map
的 HashMap
上。您在这里想要的是监视使用 HashMap
初始化的 map
。所以你可以写
@Spy
Map<String, Entity> map = new HashMap<>();
或者您可能不使用 @InjectMocks
并手动注入(inject) Dao
模拟和常规 HashMap
。这样断言也会起作用。 WRT 忽略 dao.create(entity)
,Mockito 的设计会忽略它,除非您以其他方式配置它
关于java - Mockito - InjectMocks 或如何在方法调用后获取新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202826/