当前位置: 首页 > 知识库问答 >
问题:

Mockito未返回预期值

宗沛
2023-03-14

我正在使用JUnit和Mockito库来测试我的应用程序。问题是,当我在代码下面执行时,值在运行时没有返回空列表,并且测试失败。理想情况下,当GetEmployee()get执行时,它应该返回空列表

public class Check_Test extends TestCase
{
    public void testMyCheck()
    {
        Check checkObj = new Check();
        EmployeeFactory employeeFactoryMock = Mockito.mock(EmployeeFactory.class);
        Mockito.doReturn(Collections.EMPTY_LIST).when(employeeFactoryMock).getEmployee();
        String str = checkObj.myCheck();
        assertEquals("", str);
    }
}
public class Check
{
    public String myCheck()
    {
        List<Employee> employee = EmployeeFactory.getInstance().getEmployee();
        if (employee.isEmpty())
        {
            return ""; //Line No. 8 returning empty but, control is not coming here
        }
        else
        {
            return "NotEmpty"; // The control is always coming here ????
        }
    }
}

我热切期待着支持。有没有人能帮我一下,如何通过这个测试用例???。如何通过Mockito使第8行的控件通过测试用例???

请假设,下面两个类没有真实的代码,我们只有二进制文件作为JAR文件,我们不能修改下面的代码....我附上这个是为了我们的理解...

public class EmployeeFactory
{

    private EmployeeFactory()
    {

    }

    public static EmployeeFactory getInstance()
    {
        return EmployeeFactoryHelper.INSTANCE;

    }

    private static class EmployeeFactoryHelper
    {
        public static final EmployeeFactory INSTANCE = new EmployeeFactory();
    }

    private static List<Employee> employees = null;

    static
    {
        employees = Arrays.asList(
                                  new Employee("Manish", "Kumar", true, 60),
                                  new Employee("Siva", "Attla", true, 42),
                                  new Employee("Anand", "Manivel", false, 51),
                                  new Employee("Madhavi", "Govind", true, 45),
                                  new Employee("Janani", "Chidambaram", true, 45),
                                  new Employee("Mannu", "Krishna", false, 39),
                                  new Employee("Karthika", "Hosamane", false, 39)
                          );
    }

    public List<Employee> getEmployee()
    {
        return employees;

    }

}


public class Employee
{

    private String firstName;
    private String lastName;
    private boolean workStatus;
    private int age;

    public Employee(String firstName, String lastName, boolean workStatus, int age)
    {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.workStatus = workStatus;
        this.age = age;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    public boolean isWorkStatus()
    {
        return workStatus;
    }

    public void setWorkStatus(boolean workStatus)
    {
        this.workStatus = workStatus;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }

    @Override
    public String toString()
    {
        return "Employee [firstName=" + firstName + ", lastName=" + lastName + ", workStatus=" + workStatus + ", age=" + age + "]";
    }

}

共有1个答案

葛胡媚
2023-03-14

不是调用静态工厂方法,而是注入工厂(可能在构造函数中)并在类中使用它。这样,您就可以解耦类,并且您将能够在测试阶段注入一个模拟实现,而不是真正的实现。小例子:

class EmployeeFactory{
  public Employee getEmployee(){...}
}

class Check{
  private EmployeeFactory factory;
  public Check(EmployeeFactory factory){ this.factory = factory;

  public String myCheck()
  {
    List<Employee> employee = factory.getEmployee();
}

在模拟中:

public class Check_Test extends TestCase
{
    public void testMyCheck()
    {
        EmployeeFactory employeeFactoryMock = Mockito.mock(EmployeeFactory.class);
        Check checkObj = new Check(employeeFactoryMock);
        Mockito.doReturn(Collections.EMPTY_LIST).when(employeeFactoryMock).getEmployee();
        String str = checkObj.myCheck();
        assertEquals("", str);
    }
}
 类似资料:
  • 我正在对我的一个服务进行Mockito单元测试,我试图模拟它,但无法返回所需的对象。我的代码片段如下所示: 现在,通过了测试用例,但是失败了,因为。 我很困惑,我不是刚刚模拟了返回一个的行为吗?我做了一些研究,发现了这篇文章:Mockito when/then not returning expected value,我想知道如何使用“doreturn()...when()”定义嘲笑行为,但仍然没

  • 为了澄清所使用的输入是100,用于投资金额,利率为5%(在该程序中,取5/100,然后/12=0.00417),在这种情况下,投资的持续时间为6个月。因此,在任何利息累积之前的第0个月,没有利息,所以这只是投资的投入金额(100)。然后,在第一个月,它现在运行正常((100*i)*(i interest());或在或情况下((100*1)*(10.00417))=100.417 但当我到了第二个月

  • 我正在学习AOP Spring并尝试一些示例。关于@AfterBack ning,我所理解的是,只有当目标成功返回并且与切入点匹配时,才会调用该方法。然而,在我的例子中,如下所示,我有一个切入点,它定义了所有只返回字符串的方法,但它调用了所有空方法以及返回字符串的方法。 我的建议: 请在下面找到我的Impl课程: 请在下面找到我的MainApp类: 我原本希望只调用getCustomer(),因为

  • 问题内容: 我正在使用Newtonsoft的Json.Net从以下json中选择节点: 以下C#代码段 产量: 现在,这很酷,我想做的是按客户端代码过滤,我认为 可以,但是我显然对语法不够了解。这将返回一个空列表: 并且单个令牌选择器返回null: 我在https://jsonpath.curiousconcept.com/上尝试了几种不同的配置,看来我的查询语法确实坏了。 使用Flow Comm

  • 该函数提示用户选择石头、纸或剪刀,并将输入更改为小写。如果用户未选择上述选项之一,则返回if语句。但是,如果选择了正确的选项,则会返回其他语句。 但是,如果用户输入适当的响应,else语句不会运行。 如果我输入石头/布/剪刀以外的东西,我希望if语句运行。但是如果我输入石头/纸/剪刀,我希望其他语句运行。 但是,无论如何,else语句都不会运行。

  • 新的云功能和承诺。我尝试在不同的位置添加承诺,但仍然在日志中得到消息。第一,我不确定我应该在哪里添加承诺,第二,我是否应该什么也不回。在调用match(如果条件满足,则创建channel)之后,我不需要执行另一个函数。虽然触发onCreate会有多个用户,所以我想确保每次执行一个用户。 编辑1-我尝试将事务更改为使用await,这样它将只在事务之后更改UserLife节点。得到这两个警告。1)应在