【发布时间】:2017-07-02 03:06:03
【问题描述】:
我设置了以下测试。由于用户设置为“虚拟”,我不明白测试如何成功通过。
@RunWith(MockitoJUnitRunner.class)
public class TodoServiceAbstractImplTest
{
@InjectMocks
TodoServiceAbstractImpl todoServiceAbstractImpl = new TodoServiceAbstractImpl();
@Mock
SomeRandomClass someRandomClass;
@Mock
TodoServiceAbstract todoServiceAbstract;
@Test
public void testRetrieveTodo_usingAMock(){
todoServiceAbstractImpl.setUser("Dummy"); //Set the user to be "Dummy" already
assertEquals(null,todoServiceAbstractImpl.getUser()); //Why is the user is still null?
}
}
这里是相关的类。我创建它们是为了测试 Mockito,因为我仍在学习 Spring Boot 中的测试。
SomeRandomClass 的定义:
public class SomeRandomClass{
private String field;
public SomeRandomClass(){
}
public SomeRandomClass(String field){
setRandom(field);
}
public void setRandom(String field){
this.field = field;
}
public String getRandom(){
return field;
}
}
抽象类的定义:
public abstract class TodoServiceAbstract {
@Autowired
private SomeRandomClass RandomUser;
public TodoServiceAbstract(){
//RandomUser = new SomeRandomClass();
}
public void setUser(String user){
this.RandomUser.setRandom(user);
}
public String getUser(){
return RandomUser.getRandom();
}
public abstract List<String> retrieveTodos(String user);
}
抽象实现的定义
public class TodoServiceAbstractImpl extends TodoServiceAbstract{
public List<String> retrieveTodos(String user){
if(user == getUser()){
return Arrays.asList("item 1", "item 2",
"item 3");
}
return Arrays.asList("Random item");
}
}
【问题讨论】:
-
你为什么期待
null以外的东西?SomeRandomClass被嘲笑,所以在调用setUser时它显然没有实际设置任何东西。为什么要这样做?这就是模拟的意义所在。 -
@Tom 您的评论是正确答案。如果您将其发布为答案,我将投票赞成。
-
@DavidWallace 随意自己做,我不回答这样的问题。谢谢你:)。
-
@Tom 是的,你说得对。我不应该期待什么。我是测试世界的新手,在理解 Mock 之前试图弄清楚为什么我的代码不起作用。不过这篇文章对我帮助很大:stackoverflow.com/questions/2277039/how-do-mock-frameworks-work
标签: java unit-testing spring-boot junit mockito