为什么 getName() returns null 使用 mockito?
why getName() returns null using mockito?
Person.java就是这个代码。
public class Person {
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName() {
return name;
}
}
这是测试代码。
import org.mockito.Mock;
import junit.framework.*;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
public class PersonTest {
@Mock
private Person person;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testSetName() {
person.setName("Larry");
assertEquals("Larry", person.getName());
}
我用这段代码进行测试,但是 person.getName() returns 为空,我的测试失败了。
我不知道为什么会失败。
你能解释为什么吗? :(
因为您没有测试您的代码。您正在测试 Mockito。
不应该嘲笑这个人。模拟 class 意味着:用什么都不做的方法替换所有方法的实现。所以这就是发生的事情: getName()
被一个什么都不做的方法所取代。所以它 return 为空。
所以测试应该是:
public class PersonTest {
private Person person;
@Before
public void setUp() {
person = new Person();
}
@Test
public void testSetName() {
person.setName("Larry");
assertEquals("Larry", person.getName());
}
}
Mocking 可用于模拟被测对象的 dependencies。因此,如果您测试一个 UserService,而这个 UserService 使用一个 UserDAO,您可以模拟 UserDAO 来测试 UserService 的真实代码:当它的 findAll()
方法被调用时,您将 DAO 告诉 return 2 个用户,然后调用UserService的一个方法,内部调用userDao.findAll()
,userService接收到两个用户。然后您还可以验证 userDao.findAll()
已被调用。
你在嘲笑Person
;如果你没有明确地告诉 Mockito return 一些方法它会 return null
.
请注意,您所做的事情没有多大意义。您似乎想测试 Person
,那么您不应该模拟 Person
,而应该使用 new Person()
创建 Person
的真实实例。您使用模拟来替换要测试的 class 的(复杂)依赖项,因此您可以测试其在特定输入上的行为。这不是你想要的。
改为:
@Test
public void testSetName() {
Person person = new Person();
person.setName("Larry");
assertEquals("Larry", person.getName());
}
通常测试应该像
@Test
public void testSetName() {
when(person.getName()).thenReturn("Larry");
assertEquals("Larry", person.getName());
}
不过真的没什么用,总会过去的。这里没有真正要测试的用户定义逻辑。正如上面有人所说,您正在测试 mockito 而不是您的方法。
Person.java就是这个代码。
public class Person {
private String name;
public void setName(String name)
{
this.name = name;
}
public String getName() {
return name;
}
}
这是测试代码。
import org.mockito.Mock;
import junit.framework.*;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
public class PersonTest {
@Mock
private Person person;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testSetName() {
person.setName("Larry");
assertEquals("Larry", person.getName());
}
我用这段代码进行测试,但是 person.getName() returns 为空,我的测试失败了。
我不知道为什么会失败。 你能解释为什么吗? :(
因为您没有测试您的代码。您正在测试 Mockito。
不应该嘲笑这个人。模拟 class 意味着:用什么都不做的方法替换所有方法的实现。所以这就是发生的事情: getName()
被一个什么都不做的方法所取代。所以它 return 为空。
所以测试应该是:
public class PersonTest {
private Person person;
@Before
public void setUp() {
person = new Person();
}
@Test
public void testSetName() {
person.setName("Larry");
assertEquals("Larry", person.getName());
}
}
Mocking 可用于模拟被测对象的 dependencies。因此,如果您测试一个 UserService,而这个 UserService 使用一个 UserDAO,您可以模拟 UserDAO 来测试 UserService 的真实代码:当它的 findAll()
方法被调用时,您将 DAO 告诉 return 2 个用户,然后调用UserService的一个方法,内部调用userDao.findAll()
,userService接收到两个用户。然后您还可以验证 userDao.findAll()
已被调用。
你在嘲笑Person
;如果你没有明确地告诉 Mockito return 一些方法它会 return null
.
请注意,您所做的事情没有多大意义。您似乎想测试 Person
,那么您不应该模拟 Person
,而应该使用 new Person()
创建 Person
的真实实例。您使用模拟来替换要测试的 class 的(复杂)依赖项,因此您可以测试其在特定输入上的行为。这不是你想要的。
改为:
@Test
public void testSetName() {
Person person = new Person();
person.setName("Larry");
assertEquals("Larry", person.getName());
}
通常测试应该像
@Test
public void testSetName() {
when(person.getName()).thenReturn("Larry");
assertEquals("Larry", person.getName());
}
不过真的没什么用,总会过去的。这里没有真正要测试的用户定义逻辑。正如上面有人所说,您正在测试 mockito 而不是您的方法。