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

Ana*_*050 14 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";
        }
    }
Run Code Online (Sandbox Code Playgroud)

我写的测试用例是:

    @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) ;
        }

    }
Run Code Online (Sandbox Code Playgroud)

如果我使用这样的东西

Mockito.when(deviceDao.findByDeviceSerialNo("234er")).thenReturn(deviceEntity); 
Run Code Online (Sandbox Code Playgroud)

然后它工作,并给我不是Device的null对象.

这是什么原因?

Gui*_*Sim 31

您设置模拟以在收到给定设备对象时返回一些内容:

        Device device = new Device() ;
        Mockito.when(deviceDao.save(device)).thenReturn(deviceEntity);
Run Code Online (Sandbox Code Playgroud)

这告诉你的deviceDaomock 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";
}
Run Code Online (Sandbox Code Playgroud)

这会调用save()一个新Device实例. 我非常怀疑这device与你设置模拟的那个相同.

解决此问题的一种方法是在测试中使用更广泛的匹配器:

Mockito.when(deviceDao.save(any(Device.class)).thenReturn(deviceEntity);
Run Code Online (Sandbox Code Playgroud)

或者只是确保Device您设置模拟的设置与代码中使用的设置相同.我无法向您提供示例,因为您的问题不包含代码Device.equals().

  • 任何(Device.class)为我工作......! (3认同)