Spring JpaRepository save()不使用Mockito进行模拟

时间:2015-06-24 13:45:47

标签: java spring mockito

我是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); 

然后它工作,并给我不是设备的空对象。

这是什么原因?

1 个答案:

答案 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的代码。