spring-boot - 如何使用 JUnit 在 Spring Boot 中的公共方法中模拟私有方法
问题描述
我想问你几个问题并征求你的意见:
我想测试我的公共方法(我使用 Spring Boot、Mockito、JUnit):
@Service
public class MyClass{
public Long getClientId(List<String> nameSurname) throws AuthorizationException {
Long operatorId;
if(...){
(... something not interesting ...)
User user = getUserByLogin("AnthonyGates2");
operatorId = nonNull(user) ? user.getOperatorId() : null;
} else {
List<User> users = getUserListByLogin("AnthinyGates");
operatorId = isNotEmpty(users) ? return operatorId;
return operatorId;
}
如何测试方法getClientId
?
方法getUserByLogin
和getUserListByLogin
在此类 ( MyClass
) 中是私有的,但我必须模拟这些私有方法的结果,因为这些方法从外部服务检索数据。这些私有方法看起来像:
User user = DelegateImpl.getDelegate().getUserByLogin(nameAndSurname);
DelegateImpl.getDelegate().getUserByLogin 从数据库中获取数据,并且必须像这样模拟该数据:
when(DelegateImpl.getDelegate().getUserByLogin(any())).thenReturn(user);
如何测试我的公开课?我应该使用 PowerMock/PowerMockito 吗?在我看来,将这些方法公开是丑陋的,因为这些方法仅在MyClass
. 我在 Internet 上找不到适合我的案例的好的教程(Spring Boot、Mockito、JUnit)。
非常感谢您的所有提示!
最好的问候马修
解决方案
仅通过调用公共方法来测试单元。我认为您的示例是服务层中的一个类(包含业务逻辑),两个 getUser... 方法应该在不同的类中(我认为在数据层中),它们可以是公共的。通过构造函数将该类作为依赖项(在服务对象中)注入,以便在测试服务类时模拟它。数据层类(使用 getUser... 方法)也可以通过它自己的单元测试进行测试。
推荐阅读
- java - CXF 客户端 - 在每个请求之间关闭 TCP 连接
- markdown - 当 Doxygen 生成 HTML 时,为什么 Markdown 中的围栏代码块不以等宽字体显示?
- flutter - flutter_bloc 4.0.0 如何获取事件属性/参数
- java - 将 PDF 复制到新的 PDF,但没有文档的某些部分
- python - tensorflow.python.framework.errors_impl.OutOfRangeError:读取的字节数少于请求的字节数 [[{{node checkpoint_initializer_196}}]]
- python - 如何更改seaborn条形图中的y轴范围?
- mysql - 计划事件以更改 mysql 中的列
- r - 以 Lattice 中的两个变量为条件
- c++ - 如何导入已用 VCPKG 导出的 zip 文件
- javascript - Javascript:如何在表格中搜索多于两列