gpt4 book ai didi

java - Mockito 未返回预期值

转载 作者:行者123 更新时间:2023-12-01 16:46:03 24 4
gpt4 key购买 nike

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

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

我尽我所知尝试了所有可能性,但我无法通过这个测试用例。

下面的 Check 类具有我需要测试空的 myCheck() 方法...

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 ????
}
}
}

我热切期待支持。任何人都可以帮我看看如何通过这个测试用例吗???如何让第8行的控件通过Mockito来通过测试用例???

请假设,下面的两个类没有真正的代码,我们只有二进制文件作为 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 + "]";
}

}

最佳答案

“通常”的事情:你不明白自己在做什么。

含义:“仅仅创建”一个模拟对象是不够的。您必须以某种方式确保您正在测试的代码使用相应的模拟对象,例如使用@InjectMocks注释。

本质上,您真正的问题是您在不了解 Mockito 的情况下就开始使用它。低效的策略。相反,您应该首先从上到下阅读一篇好的 Mockito/Junit 教程(如 this 一个)。 理解什么是模拟,以及应该如何使用它们。以及如何确保您的测试中的代码使用模拟对象。

这里的问题是您创建的代码不必要地难以测试。鉴于您当前的设计,您必须使用 PowerMock(ito) 或 JMockit - 因为您必须“拦截”此调用

public static final EmployeeFactory INSTANCE = new EmployeeFactory();

您的问题是您必须控制该 INSTANCE 对象。由于您无权访问该对象,因此您必须拦截对 new() 的调用,并且只有 PowerMock(ito) 或 JMockit 允许您执行此操作.

所以,真正的答案是改变你的设计,例如:

public class Check { 
private final EmployeeFactory factory;
public Check() { this(EmployeeFactory.getInstance()); }

Check(EmployeeFactory factory) { this.factory = factory }

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

现在您可以使用带参数的构造函数轻松注入(inject)一个模拟工厂对象,该对象返回您需要返回的内容。

关于java - Mockito 未返回预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50373508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com