为什么getName()使用Mockito返回null



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());        
}

i使用此代码测试,但是person.getName()返回null,我的测试失败。

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

因为您没有测试代码。您正在测试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,则可以模拟用户dao来测试真正的用户服务守则:您告诉dao在调用 findAll()方法时返回2个用户,然后调用userervice的方法,该方法称为userervice的方法。内部调用userDao.findAll(),UserService接收了两个用户。然后,您还可以验证userDao.findAll()已被调用。

您正在模拟Person;如果您不明确告诉Mockito返回某种方法,它将返回null

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

而不是:

@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而不是您的方法。

相关内容

  • 没有找到相关文章