当使用Mockito运行JUnit测试用例时,我从下面的manager.managerLogString
方法(@InjectMocks
ArticleManager类的方法)返回null值。
TestingString = manager.managerLogString();
同时,我能够为下面的mockito验证方法获得正确的"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);
}
此处:
@Mock
User user;
然后你去:
user.setMyuserString("UserInput");
// verify this mock class return correct value
verify(user).setMyuserString("UserInput");
这根本没有任何意义。你在嘲笑那个类。这意味着你创建了一个对象,上面写着"我是用户",但实际上并不是。换句话说:当调用mock的logMyUserString()
时,你唯一想/需要做的就是告诉它返回期望的值!
如:
when(user.logMyUserString()).thenReturn("User Input");
现在,当正确使用@InjectMocks调用logMyUserString()
时,mock将返回您要求它返回的字符串。但您想在这里了解注入有多容易出错。
使用setter方法没有意义,因为setter是"人造的",它不会设置任何内容!
除此之外:为什么在生产代码类中有@Inject注释?如果你认为你需要它们来制作mockito,呃,不,你不需要。
最后:我认为你应该回去看看一个好的Mockito教程。你真正的问题是你不了解自己在做什么。
您没有创建ArticleManager
的实例
试试这种方式
@RunWith(MockitoJUnitRunner.class)
public class MockExample {
@Mock User user;
@InjectMocks private ArticleManager manager = new ArticleManager();
private String TestingString;