当前位置: 首页 > 知识库问答 >
问题:

当我测试另一个类时,Mockito不能模拟第三个类的属性

尹赞
2023-03-14

我在使用Mockito时遇到了麻烦,因为当我测试另一个时,我不能嘲笑第三类的属性。

我正在测试的类:

@Component
public class MyTransformer {
    @Autowired
    private MyService myService;
    
    public Output myMethod(Context context, Input input, Something something) throws Exception {
        ServiceInput serviceInput = createServiceInput(something);
        myService.doSomething(context, input, serviceInput);
        return new Output(); 
    }
}

上一个类中使用的接口:

public interface MyService {
    public void doSomething(Context context, Input input, Something something) throws Exception;
}

服务的真正实现:

@Service
public class MyServiceImpl implements MyService {

    @CustomServiceAnnotation(serviceName = "MyServiceName", apiPaths = {
        ServiceApiPath.class
    })
    private GatewayProxyInvoker gatewayProxyInvoker; // this property is null

    @Override
    public void doSomething(Context context, Input input, Something something) throws Exception {
        Request request = MyServiceCommand.createRequest(context, input, something);
        Response response = Invoker.invoke(Response.class, gatewayProxyInvoker, context, request);
    }
}

由于gatewayProxyInvoker属性为null而引发NullPointerException的类:

public class Invoker {
    public static T invoke(final Class<T> responseType, final GatewayProxyInvoker gatewayProxyInvoker, final Context context, S request) throws Exception {
        return gatewayProxyInvoker.invoke(responseType, context, request);
    }
}

测试等级:

@RunWith(MockitoJUnitRunner.class)
public class MyTransformerTest {
    @InjectMocks
    private MyTransformer transformer;

    @Mock
    private MyServiceImpl myService;
    
    @Mock
    private GatewayProxyInvoker gatewayProxyInvoker;
    
    @Test
    public void myMethodTest() throws Exception {
        Response myResponse = new Response();
        
        doCallRealMethod().when(myService).doSomething(any(Context.class), any(Input.class), any(Something.class));
        
        when(gatewayProxyInvoker.invoke(any(Class.class), any(Context.class), any(Request.class))).thenReturn(myResponse);
        
        transformer.myMethod(/*valid input params*/);
    }
}

属性“gate wayProxyInvoker”为空,因此我认为我在嘲笑它的过程中做错了什么。

代码运行良好,是我的JUnit测试不起作用。

在测试另一个类时,如何模拟第三个类的属性?在我的示例中,您可以看到该方法是void,我正在测试的类使用接口。

谢谢大家,伙计们!

共有1个答案

施振海
2023-03-14

我在这里找到了一个解决方案:Mockito将mock注入间谍对象

这个例子效果很好:

@RunWith(MockitoJUnitRunner.class)
public class MyTransformerTest {
    @InjectMocks
    private MyTransformer transformer;

    @InjectMocks
    private MyServiceImpl myService;
    
    @Mock
    private GatewayProxyInvoker gatewayProxyInvoker;
    
    @Before
    public void init() {
        myService = Mockito.spy(new MyServiceImpl());
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void myMethodTest() throws Exception {
        Response myResponse = new Response();
        when(gatewayProxyInvoker.invoke(any(Class.class), any(Context.class), any(Request.class))).thenReturn(myResponse);
        transformer.myMethod(/*valid input params*/);
    }
}
 类似资料:
  • 我试图模拟一个公共类,但是当这样做时,Mockito抛出一个异常。 我想嘲弄的班级:https://github.com/scribejava/scribejava/blob/master/scribejava-core/src/main/java/com/github/scribejava/core/builder/ServiceBuilder.java 测试代码: 完整堆栈跟踪:

  • 我正在尝试在我的Spring启动应用程序中测试一个服务类。服务类中注入了bean。但是当我试图在我的测试类中模拟这个bean时,我遇到了问题。在测试用例中出现以下错误: 测试类看起来像这样: //没有什么花哨的,只是简单的验证保存方法被调用 我所尝试的: Mockito无法模仿这个类 将mockito内联版本更新为较新/较旧版本 使用的依赖项: mockito-inline::3

  • 我正在使用PowerMockito为一个类编写junit。我可以模拟私有方法,但无法模拟另一个类的公共方法。在下面的测试类中,B的对象没有被模仿。我做错了什么? 另一个具有所有公共方法的类B 现在我有A班的考级 下面是我使用的依赖关系-

  • 问题内容: 我正在为具有两个方法methodA,methodB的类编写JUnit测试用例。我想在测试用例中模拟对methodA的methodB调用,我正在对正在测试的类使用间谍,但仍然执行methodB。 这是课程 这是测试课 尽管我已对其进行了模拟,但方法B仍会得到调用。请向我建议一个使用正确方法模拟同一类methodA的methodB调用的解决方案。 问题答案: 我昨天碰到这个,因为间谍最好做

  • 我希望你能帮助我。 我的问题是: 当传递数组列表中的对象的实例时,我将该数组列表传递给另一个类,如何访问它的属性? 我可以在将其传递给另一个类之前访问属性。 “主要”类将数据传递给“员工”类。 “Employees”类接收数据,将其添加到一个数组中,然后从该数组转到“AllStaff”类 请注意,我可以在方法“addToAll人员()”中访问属性 在类"所有的工作人员",是我没有访问的属性 完整代