java - InjectMocks 类的方法返回 Null
问题描述
使用 Mockito 运行 JUnit 测试用例时,我从下面manager.managerLogString
的方法( ArticleManager@InjectMocks
类的方法)返回空值。
TestingString = manager.managerLogString();
同时,我能够UserInput
为下面的 mockito 验证方法获得正确的 " " 值。
verify(user).setMyuserString("UserInput");
如下捕获的完整代码,如果您能提供建议,不胜感激。
package com;
public class User {
private String userString;
public User() {}
public void setMyuserString(String userString) {
this.userString = userString;
}
public String logMyUserString() {
return this.userString;
}
}
文章经理:
package com;
import javax.inject.Inject;
public class ArticleManager{
@Inject
private User user;
public String managerLogString() {
return this.user.logMyUserString();
}
}
测试:
package com;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@RunWith(MockitoJUnitRunner.class)
public class MockExample {
@Mock User user;
@InjectMocks private ArticleManager manager;
private String TestingString;
@Test
public void test() {
user.setMyuserString("UserInput");
// verify this mock class return correct value
verify(user).setMyuserString("UserInput");
// why this manager.managerLogString return null value ??
TestingString = manager.managerLogString();
System.out.println(TestingString);
assertEquals("UserInput", TestingString);
}
}
有了这里的建议,代码现在运行良好。更新后的代码如下所示。
更新代码:
@Test
public void test() {
when(user.logMyUserString()).thenReturn("UserInput");
TestingString = manager.managerLogString();
verify(user).logMyUserString();
System.out.println(TestingString);
assertEquals("UserInput", TestingString);
}
解决方案
这里:
@Mock
User user;
然后你去:
user.setMyuserString("UserInput");
// verify this mock class return correct value
verify(user).setMyuserString("UserInput");
这根本没有任何意义。你在嘲笑那个班级。这意味着您创建了一个对象,上面写着“我是用户”,但实际上并非如此。换句话说:您唯一想要/需要做的就是告诉您的模拟在logMyUserString()
调用时返回预期值!
如:
when(user.logMyUserString()).thenReturn("User Input");
现在,当您正确使用 @InjectMocks 调用时logMyUserString()
,模拟将返回您告诉它返回的字符串。但是您想在这里查看以了解注入是多么容易出错。
使用 setter 方法没有意义,因为该 setter 是“人造的”,它没有设置任何东西!
除此之外:为什么你的生产代码类中有@Inject 注释?如果你认为你需要它们来模拟,错了,不,你不需要。
最后:我认为你应该回去看看一个好的 Mockito教程。你真正的问题是你对自己在做什么缺乏了解。
推荐阅读
- pine-script - 买入订单执行是当前蜡烛的限价订单,而不是下一个蜡烛
- angular - 如何使列表中的按钮消失?
- c# - Visual Studio 在 C# 中的方法重载上显示白色文本
- regex - 使用连接字符串进行简单的正则表达式替换
- ibm-cloud - kubeconfig 是否有可能过期?
- vue.js - 使用模板中的道具接收的数据(vue)
- bash - 如何修复无序列并将它们发送到 csv 文件
- elasticsearch - ElasticSearch 全局设置 minimum_should_match 参数默认值
- forms - 表单中的 Symfony 5 数字格式
- database - 如何在 Visual Studio 的 C++/CLR 项目中使用数据库?