此时,jmockit缺少对模拟类型的调用



我是Jmockit的新手,我有一个场景可以模拟该列表商业逻辑。当我使用以下实现时,我会得到 java.lang.illegalstateException:此时缺少对模拟类型的调用;请确保仅在声明合适的模拟字段或参数

之后才出现此类调用。

请在下面找到我的实现。

package com.example.logic;
import java.util.ArrayList;
import java.util.List;
public class EmployeeDao {
    public boolean validate() {
        List<String> list = getList();
        if (list.size() > 0) {
            return true;
        }
        return false;
    }
    public List<String> getList() {
        //actual logic for getting the data 
        List<String> list = new ArrayList<>();
        return list;
    }
}

测试

package com.example.test;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import com.example.logic.EmployeeDao;
import mockit.NonStrictExpectations;
public class EmployeeDaoTest {
    @Test
    public void testEmployeeDaoTest() {
        EmployeeDao employeeDao = new EmployeeDao();
        new NonStrictExpectations() {
            {
                employeeDao.getList();
                // returns("A", "B");
                //times = 1;
                result = getMockList();
                //returns("A", "B");
            }
        };
        assertTrue(employeeDao.validate());
    }
    private List<String> getMockList() {
        List<String> list = new ArrayList<>();
        list.add("A");
        return list;
    }
}

当我运行上述测试类时,我会收到以下错误。但是,插入就业的内容,如果使用了@mocked注释,那么我只会得到断言错误

@Mocked
EmployeeDao employeeDao;

几乎没有研究过,我通过使用模型来嘲笑该方法的另一种方法。但是由于某些原因,我不想使用。这会有所帮助如果可以用我写的上述方法对此进行处理。只是想知道上述实现问题。

java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameter
    at com.example.test.EmployeeDaoTest$1.<init>(EmployeeDaoTest.java:23)
    at com.example.test.EmployeeDaoTest.testEmployeeDaoTest(EmployeeDaoTest.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

您遇到的问题是您需要使用部分模拟(因为您正在测试类并模拟其方法之一(。

这样做的方式就是这样:

@Test
public void testEmployeeDaoTest() {
    EmployeeDao employeeDao = new EmployeeDao();
    new NonStrictExpectations(employeeDao) {
        {
            employeeDao.getList();
            // returns("A", "B");
            //times = 1;
            result = getMockList();
            //returns("A", "B");
        }
    };
    assertTrue(employeeDao.validate());
}

两件事:

  • 在V1.25中删除了NonStrictExpectations类。电流版本为v1.39。您可能需要升级并从所有最新修复和增强中获利
  • 上面的第一个示例没有模拟任何内容,添加@Mocked注释嘲笑EmployeeDao的每个实例,这实际上意味着您不会测试任何内容。

中间立场是一个部分模拟,它将仅模拟类或实例的选择方法。我已经修改了使用minTimes = 0的常规Expectations实例(使其可选(,并简化了IMHO更可读的测试的结果:

@Test
public void testEmployeeDaoTest() {
    EmployeeDao employeeDao = new EmployeeDao();
    new Expectations(EmployeeDao.class) {
        {
            employeeDao.getList();
            result = Collections.singletonList("A");
            minTimes = 0;
        }
    };
    assertTrue(employeeDao.validate());
}

创建基于测试用例

的getList((方法的模型 返回所需的对象
 new MockUp<EmployeeDao>() {
                @Mock
               List<String> getList() // no access modifier required
                {
                    return requiredListOutput;
                }
    }
     new Expectations() {
                {
            };
     assertTrue(employeeDao.validate());//required assertions

最新更新