当使用Mockito运行JUnit测试用例时,我从下面的manager.managerLogString
方法(@InjectMocks
ArticleManager类的方法)中返回空值。
TestingString = manager.managerLogString();
同时,我可以为下面的模仿验证方法获取正确的“ UserInput
”值。
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);
}
答案 0 :(得分:1)
这里:
@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()
时, mock 将返回您告诉它返回的字符串。但是您想看看here来了解注入出错的可能性。
使用setter方法没有意义,因为该setter是“人工的”,它什么也没设置!
除此之外:为什么在生产代码类中有@Inject批注?如果您认为需要它们来进行模仿,那么,不,您不需要。
最后:我认为您应该回过头来看看一个好的Mockito tutorial。真正的问题是您对自己的工作缺乏了解。
答案 1 :(得分:0)
您没有创建ArticleManager
尝试这种方式
@RunWith(MockitoJUnitRunner.class)
public class MockExample {
@Mock User user;
@InjectMocks private ArticleManager manager = new ArticleManager();
private String TestingString;