为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Mockito 的 Java Mock final void 方法

使用 Mockito 的 Java Mock final void 方法

狐的传说 2021-09-29 15:19:52
我需要一些帮助来理解如何对以下内容进行单元测试。我有以下类结构。我必须按原样遵循结构,因为这是根据我们产品的框架,我不能偏离这一点。package com.rohan.baseimport javax.inject.Inject;public abstract class ServiceBase {    @Inject    protected CommandExecutorBase commandExecutor;    public final void execute() {        commandExecutor.execute(this);    }   }--------------------------------------------------------package com.rohan.servicespublic class MyService extends ServiceBase {    public void someMethod() {} }--------------------------------------------------------package com.rohan.delegatesimport javax.inject.Inject;import com.rohan.services.MyServicepublic 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方法中定义模拟时,为什么它会继续尝试执行真正的方法?谢谢!
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

作为单元测试的一部分,我认为不需要定义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。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信