Spring JpaRepository save() 不使用 Mockito 模拟

2022-09-02 20:09:03

我是Mockito图书馆的新手,被困在某个地方。

问题是,当我模拟Spring jpaRepository的保存方法时,我总是得到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

您将模拟设置为在收到给定设备时返回某些内容:

        Device device = new Device() ;
        Mockito.when(deviceDao.save(device)).thenReturn(deviceEntity);

这会告诉您的 mock 在作为参数接收到方法时返回。deviceDaodeviceEntitydevicesave

Mockito用于参数匹配。这意味着,如果调用 ,如果 为 true,则返回 。equalsdeviceDao.save(x)deviceEntityx.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

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

Mockito.when(deviceDao.save(any(Device.class)).thenReturn(deviceEntity);

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


答案 2

推荐