首页 文章

如何使用JUnit在Spring Boot中公共方法中模拟私有方法

提问于
浏览
0

我想问你几个问题,并征求你的意见:

我想测试我的公共方法(我使用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) .

非常感谢你的所有提示!

最好的问候马修

2 回答

  • 1

    如果你无法对一个方法/类进行单元测试,那么它很可能意味着它只是做了太多 . 尝试将私有方法提取到单独的类 . 它不需要公开 - 你可以例如将它包装在本地包装中 .

    之后,在测试中,您必须注入此类的模拟并模拟其行为 .

    MyClass在其单元测试中的设置可能类似于:

    AnotherClass anotherClassMock = Mockito.mock(AnotherClass.class);
    MyClass myClass = new MyClass(anotherClassMock);
    

    其中AnotherClass有方法getUserListByLogin和getUserByLogin .

    编辑:似乎私有方法中的逻辑已经调用外部类 . 问题是您通过调用另一个类中的静态 getDelegate() 方法获取对象的实例 .

    这是你可以做的:

    • MyClass 中创建一个新字段,该字段的类型与 getDelegate() 方法返回的字段相同(我不会't know what that is, I' ll称之为 Delegate

    • 有2个构造函数:一个默认的构造函数将 getDelegate 方法的结果分配给您的新字段,另一个构造函数将 Delegate 的实例作为参数并将其分配给您的字段

    • 在测试中使用第二个构造函数创建 MyClass 的实例并传递 Delegate 类的模拟

    看起来更像是这样:

    class MyClass() {
        private Delegate delegate;
    
        MyClass() {
            this.delegate = DelegateImpl.getDelegate();
        }
    
        MyClass(Delegate delegate) {
            this.delegate = delegate;
        }
        // ... the rest
    }
    
  • 1

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

相关问题