Jmockit无法返回带有状态的新实例吗?

时间:2017-10-10 03:28:29

标签: java junit jmockit

这是我要测试的矿山服务方法

public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
private EmployeeDao employeeDao;

    @Override
    public Employee addEmployee(String address) {
        Employee employee = new Employee();
        employee.setAddress(address);

        return employeeDao.create(employee);
    }
}

这是我的测试类

@RunWith(JMockit.class)
public class EmployeeServiceImplTest {

    @Tested
    private EmployeeServiceImpl employeeServiceImpl;

    @Injectable
    private EmployeeDaoImpl employeeDao;

    @Test
    public void testAddEmployee() {
            new Expectations() {{
                Employee employee = new  Employee();
                employee.setAddress("Address1"); //line 1

                employeeDao.create(withInstanceOf(employeeDao.class));
                result = employee;
            }};

            Employee employee=employeeServiceImpl.addEmployee("Address1");
            assertEquals("Address1", employee.getAddress()); // Line 2

}

}

但是当我在第2行执行employee.getAddress()时,它返回null。它应该返回"地址1"因为我在第1行的期望中设置了它。为什么它返回为null?

1 个答案:

答案 0 :(得分:0)

你正在嘲笑错误

您正在创建的模拟与您正在嘲笑的“真实”类有关。

换句话说:你真正的班级有一个“地址”。并且它记得当你首先设置地址值时,获取地址将返回你之前设置的值。

模拟只是“看起来”像你正在测试的类。它没有国家。它不了解你的二传手和吸气者是如何相关的。

换句话说:当你放下这些期望时,你正在描述模拟在调用方法时表现的方式。因此改变:

employee.setAddress("Address1"); //line 1

 employee.getAddress(); result = "Address1";

(但我认为上面的内容可能还不够 - 你真的应该退后一步,清楚地了解你自己这里需要嘲笑哪些对象,以及哪些行为规范你需要每个人)

或者换句话说:研究概念您正在使用之前应用它们。喜欢:开始阅读jmockit文档并按照那里的示例进行操作 - 而不是发明自己的想法,没有应该如何使用嘲弄框架。