InjectMocks类的方法返回Null



当使用Mockito运行JUnit测试用例时,我从下面的manager.managerLogString方法(@InjectMocksArticleManager类的方法)返回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;

相关内容

  • 没有找到相关文章

最新更新