为什么getName()使用mockito返回null?

时间:2015-05-10 16:33:06

标签: java junit 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()返回null并且我的测试失败。

我不知道为什么会失败。 你能解释一下原因吗? :(

3 个答案:

答案 0 :(得分:5)

因为您没有测试代码。你正在测试Mockito。

不应该嘲笑这个人。模拟类意味着:通过什么都不做的方法替换所有方法的实现。这就是发生的事情:getName()被一个什么都不做的方法所取代。所以它返回null。

所以测试应该是:

public class PersonTest {

    private Person person;

    @Before
    public void setUp() {
        person = new Person();
    }

    @Test
    public void testSetName() {
        person.setName("Larry");
        assertEquals("Larry", person.getName());        
    }
}

模拟对于模拟测试对象的依赖项非常有用。因此,如果您测试UserService,并且此UserService使用UserDAO,您可以模拟UserDAO来测试UserService的真实代码:您告诉DAO在调用其findAll()方法时返回2个用户,然后您调用内部调用userDao.findAll()的UserService方法,userService接收两个用户。然后,您还可以验证是否已调用userDao.findAll()

答案 1 :(得分:2)

你在嘲笑Person;如果您没有明确告诉Mockito为某个方法返回某些内容,则会返回null

请注意,您所做的事情并没有多大意义。您似乎想要测试Person,那么您不应该模仿Person,而是使用Person创建new Person()的真实实例。您可以使用mocking替换要测试的类的(复杂)依赖项,以便可以在特定输入上测试其行为。这不是你想要的。

取而代之的是:

@Test
public void testSetName() {
    Person person = new Person();
    person.setName("Larry");
    assertEquals("Larry", person.getName()); 
}

答案 2 :(得分:0)

通常测试应该像

@Test
public void testSetName() {
    when(person.getName()).thenReturn("Larry");
    assertEquals("Larry", person.getName());        
}

但它真的没用,因为它总会过去。这里没有用户定义的逻辑来测试。如上所述,你正在测试mockito而不是你的方法。