我是Mockito图书馆的新手并且卡在了某个地方。
问题是当我模拟Spring jpaRepository的save方法时,我总是得到null。我在我的项目中使用这样的代码但是为了测试我已经制作了一个用于测试的虚拟代码。这些是我的代码:
// This is the class for which I am making test case
@Service("deviceManagementService")
@Scope(BRASSConstants.SCOPE_SESSION)
@Transactional
public class DeviceManagementServiceImpl implements DeviceManagementService {
public String show(){
Device device = new Device() ;
device.setContactName("abc");
Device deviceEntity = deviceDao.save(device);
System.out.println(deviceEntity); // i get this null always Why ???
return "demo";
}
}
我写的测试用例是:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@InjectMocks
private DeviceManagementServiceImpl deviceManagementServiceImpl;
@Mock
private DeviceDao deviceDao;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void show(){
Device device = new Device() ;
Device deviceEntity = new Device() ;
deviceEntity.setDeviceId(12L);
Mockito.when(deviceDao.save(device)).thenReturn(deviceEntity);
Mockito.when(deviceManagementServiceImpl.show()).thenReturn(null) ;
}
}
如果我使用这样的东西
Mockito.when(deviceDao.findByDeviceSerialNo("234er")).thenReturn(deviceEntity);
然后它工作,并给我不是设备的空对象。
这是什么原因?
答案 0 :(得分:30)
您设置模拟以在收到给定设备对象时返回某些内容:
Device device = new Device() ;
Mockito.when(deviceDao.save(device)).thenReturn(deviceEntity);
这会告诉您的deviceDao
模拟器在收到deviceEntity
作为device
方法的参数时返回save
。
Mockito使用equals
进行参数匹配。这意味着,如果您致电deviceDao.save(x)
,则deviceEntity
为真时将会返回x.equals(device)
。
你的方法:
public String show(){
Device device = new Device() ;
device.setContactName("abc");
Device deviceEntity = deviceDao.save(device);
System.out.println(deviceEntity); // i get this null always Why ???
return "demo";
}
这会在新的save()
实例上调用Device
。
我非常怀疑这个device
是否等同于您设置模拟的那个。
解决此问题的一种方法是在测试中使用更广泛的匹配器:
Mockito.when(deviceDao.save(any(Device.class)).thenReturn(deviceEntity);
或者只是为了确保您设置模拟的Device
与您的代码中使用的Device.equals()
相同。我无法向您提供示例,因为您的问题不包含separate
的代码。