我想问你几个问题,并征求你的意见:
我想测试我的公共方法(我使用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) .
非常感谢你的所有提示!
最好的问候马修
2 回答
如果你无法对一个方法/类进行单元测试,那么它很可能意味着它只是做了太多 . 尝试将私有方法提取到单独的类 . 它不需要公开 - 你可以例如将它包装在本地包装中 .
之后,在测试中,您必须注入此类的模拟并模拟其行为 .
MyClass在其单元测试中的设置可能类似于:
其中AnotherClass有方法getUserListByLogin和getUserByLogin .
编辑:似乎私有方法中的逻辑已经调用外部类 . 问题是您通过调用另一个类中的静态
getDelegate()
方法获取对象的实例 .这是你可以做的:
在
MyClass
中创建一个新字段,该字段的类型与getDelegate()
方法返回的字段相同(我不会't know what that is, I' ll称之为Delegate
)有2个构造函数:一个默认的构造函数将
getDelegate
方法的结果分配给您的新字段,另一个构造函数将Delegate
的实例作为参数并将其分配给您的字段在测试中使用第二个构造函数创建
MyClass
的实例并传递Delegate
类的模拟看起来更像是这样:
仅通过调用公共方法来测试单元 . 我认为你的例子是服务层中的一个类(包含业务逻辑),两个getUser ...方法应该在不同的类中(我认为在数据层中)可以是公共的 . 通过构造函数将该类作为依赖项(在服务对象中)注入,以便在测试服务类时进行模拟 . 数据层类(使用getUser ...方法)也可以通过它自己的单元测试进行测试 .