java - 如何使用 Java 中的 Jupiter 测试返回新实例的实用程序方法?
问题描述
我有一个类似的东西:
class User {
String name;
}
class Contacts {
User getUser() {
return new User();
}
}
我这样做是为了在我的测试中可以模拟如下方法:
@ExtendWith(MockitoExtension.class)
class ContactsTest {
@Spy
private Contacts sut;
@Mock
private User user;
@Test
void testSomething() {
doReturn(user).when(sut).getUser();
}
@Test
void testGetUser() {
// verify(new User(), times(1));
// verify(user, times(1));
}
}
我怎么能测试testGetUser
?
上面评论的唯一两个想法给了我这些错误:
对于第一个:
org.mockito.exceptions.misusing.NotAMockException:
Argument passed to verify() is of type User and is not a mock!
Make sure you place the parenthesis correctly!
See the examples of correct verifications:
verify(mock).someMethod();
verify(mock, times(10)).someMethod();
verify(mock, atLeastOnce()).someMethod();
对于第二个
org.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
解决方案
首先,由于您的被测单元是Contacts
类,因此无需对其spy
进行模拟并模拟其行为,因为这是您需要测试的类。所以,我会继续删除它。
现在关于您的问题,您需要测试的是 的实际结果getUser
,因此所有测试中最简单的方法是在 的实例上调用方法Contacts
并断言返回的结果是对象的non-null
实例User
。
如果您真的想测试User
该类的构造函数是否被调用,您将需要使用任何一个PowerMock
(建议不要使用,并且很可能甚至不适用于 JUnit5)或使用来实际模拟该调用mockito-inline
。
完成此操作后,您将能够User
从构造函数调用返回一个模拟实例,然后您可以在该实例上运行断言。
推荐阅读
- r - 如何合并/合并数据框中的两列并创建一个指定数据点来源的新列?
- angular - Angular removeAt 总是从 FormArray 中删除最后一个元素
- reactjs - 打字稿文件中的 prettier-eslint 运行两次并且与 eslint 规则有冲突
- linux - v4l2_ioctl 和 ioctl 的区别
- r - 在 .Rmd 文档中使用 JuliaCall 和 knitr 抑制 Julia 输出时添加提示
- android - Android 应用内购买按需下载?
- java - Java - 转换类
- huawei-mobile-services - HMS Core SDK更新至5.0.4.300及以上版本时,无弹窗提示用户安装或更新HMS Core(APK),结果码90
- c# - 部署 C++ CLI 包装器项目
- c++ - 使用 GCC 但没有使用 Clang 的堆栈帧太大(过度对齐?)