猿问

使用 Mockito 的 Java Mock final void 方法

我需要一些帮助来理解如何对以下内容进行单元测试。我有以下类结构。我必须按原样遵循结构,因为这是根据我们产品的框架,我不能偏离这一点。


package com.rohan.base


import javax.inject.Inject;


public abstract class ServiceBase {


    @Inject

    protected CommandExecutorBase commandExecutor;


    public final void execute() {

        commandExecutor.execute(this);

    }   

}


--------------------------------------------------------


package com.rohan.services


public class MyService extends ServiceBase {

    public void someMethod() {} 

}


--------------------------------------------------------


package com.rohan.delegates


import javax.inject.Inject;

import com.rohan.services.MyService


public class MyDelegate {


    @Inject

    MyService myService;


    public void callService() {

        myService.execute();

    }   

}

我正在尝试对编码进行 TDD 方法,并且我想确保callService委托类中的execute方法调用Service 类上的方法。


我尝试了以下方法,但它在执行方法中给了我一个空指针异常(因为commandExecutor对象为空)。有人可以告诉我我该怎么做吗?我不被允许使用 PowerMockito。


import org.junit.Test;

import org.mockito.Mockito;


public class MyDelegateUnitTests {


    @Test

    public void validateServiceExecuteIsCalled() {

        MyDelegate delegate = new MyDelegate();

        MyService serviceObject = Mockito.mock(MyService.class);

        delegate.myService = serviceObject;

        Mockito.doAnswer((i) -> {

            System.out.println("I am here");

            return null;

        }).when(serviceObject).execute();

        Mockito.verify(serviceObject, Mockito.times(1)).execute();

    }   

}

我无法模拟 commandExecutor 对象,因为它不可访问(与我的 Delegate 类不同的包)。代替Mockito.doAnswer(),我也尝试过Mockito.doNothing().when(serviceObject).execute();

但我得到了同样的例外。有人可以告诉我,当我尝试在when方法中定义模拟时,为什么它会继续尝试执行真正的方法?谢谢!


狐的传说
浏览 344回答 2
2回答

幕布斯6054654

作为单元测试的一部分,我认为不需要定义myService.execute方法的行为。定义行为有点不必要 Mockito.doAnswer((i) -> {        System.out.println("I am here");        return null;    }).when(serviceObject).execute();您可以删除上面的代码。验证该execute方法被调用的次数是否正确就足够了。要回答您的问题,一个建议是使用基于构造函数的注入。基本上创建一个构造函数MyDelegate并注入Myservice。并在测试中,执行以下操作:MyService serviceObject = Mockito.mock(MyService.class);      MyDelegate delegate = new MyDelegate(serviceObject);如果您不想在委托类中使用基于构造函数的注入,则其他选择是在测试中使用@InjectMocks和@Inject。
随时随地看视频慕课网APP

相关分类

Java
我要回答