java - Spring JpaRepository save() 不使用 Mockito 模拟

标签 java spring mockito

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

然后它可以工作并给我设备的非空对象。

这是什么原因?

最佳答案

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

        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() 的代码.

关于java - Spring JpaRepository save() 不使用 Mockito 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028359/

相关文章:

java - 如何在 Java 中传递 Scala 对象引用?

java - 编译时删除 JSP 文件中的前导空格/空格和空行

java - 如何模拟 void 静态方法以使用 Powermock 引发异常?

java - 如何在mockito中使用ArgumentCaptor

java - Mockito:如何匹配任何枚举参数

java - 如何在selenium xpath中的多个div之间获取子父Web元素组件?

java string.replace 使用方法运行太慢

java - 按需实例化 Spring beans,而不是在启动时实例化

java - Spring MVC REST Json 转换异常

java - Spring saml 2.0 中的用户配置