首页 > 解决方案 > 如何使用 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

方法getUserByLogingetUserListByLogin在此类 ( 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)。

非常感谢您的所有提示!

最好的问候马修

标签: spring-bootjunitmockitopowermockpowermockito

解决方案


仅通过调用公共方法来测试单元。我认为您的示例是服务层中的一个类(包含业务逻辑),两个 getUser... 方法应该在不同的类中(我认为在数据层中),它们可以是公共的。通过构造函数将该类作为依赖项(在服务对象中)注入,以便在测试服务类时模拟它。数据层类(使用 getUser... 方法)也可以通过它自己的单元测试进行测试。


推荐阅读