[英]How do I mock an optional class in java?
我在嘲笑我的 crud 应用程序,我试图嘲笑更新 API。 由于 findById() 方法属于 Optional 类,我找不到模拟它的方法。 这是代码片段。
@Mock
@Autowired
private UserRepository repo;
@Test
public void testUpdateUser() {
Integer userId = 3;
Optional<User> optionalUser = repo.findById(userId);
User user = optionalUser.get();
user.setFirstName("Paul");
repo.save(user);
User updatedUser = repo.findById(userId).get();
Assertions.assertThat(updatedUser.getFirstName()).isEqualTo("Paul");
}
@Mock
@Autowired
private UserRepository repo;
这部分代码可能会导致混淆。 背后的原理mocking
是创建一个mock
所使用的要测试的类的对象。
看起来您想测试您的存储库。 为此,您可以将测试切片与@DataJpaTest
一起@DataJpaTest
。
那么在你的情况下,你不需要模拟optional
.
如果您想测试使用UserRepository
的Service
类或其他类,您将定义一个mock
,您的类将如下所示:
@Mock
private UserRepository repo;
@InjectMocks
private UserService service;
@Test
public void testUpdateUser() {
when(repo.findById(anyInt()).get()).thenReturn(aNewInstanceOfUser());
...
}
更多阅读。
可选类是最终类,所以你不能用 Mockito 模拟这个类。 您应该使用 PowerMockito。 我在下面添加了一个示例代码。 请试试这个。
@RunWith(PowerMockRunner.class)
@PrepareForTest(Optional.class)
public class PowerMockitoExample {
@Mock
Optional<User> optionalMock;
@Mock Repository repo;
@Test
public void testUpdateUser() {
//edit your mock user
User yourUserData = null;
Mockito.when(repo.findById(Matchers.anyInt())).thenReturn(optionalMock);
PowerMockito.when(optionalMock.get()).thenReturn(yourUserData);
Integer userId = 3;
Optional<User> optionalUser = repo.findById(userId);
User user = optionalUser.get();
user.setFirstName("Paul");
repo.save(user);
User updatedUser = repo.findById(userId).get();
Assertions.assertThat(updatedUser.getFirstName()).isEqualTo("Paul");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.