我需要一些帮助来理解如何对以下内容进行单元测试。我有以下类结构。我必须按原样遵循结构,因为这是根据我们产品的框架,我不能偏离这一点。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。
添加回答
举报
0/150
提交
取消