【问题标题】:Failure on calling a method from JUnit Test Case从 JUnit 测试用例调用方法失败
【发布时间】:2014-11-24 08:16:52
【问题描述】:

我有一个问题:

我的 JUnit 测试用例中有这样一个方法:

@Test
public void test1st_scenario() {

    out = Mockito.mock(PrintStream.class);
    System.setOut(out);
    restaurant = new Restaurant();
    employee = new Employee(null, null, null);

    ArrayList<Employee> employees = new ArrayList<Employee>();
    employees.add(new Employee("Luciano", "chef", ExperienceLevel.LOW));
    employees.add(new Employee("Naved", "waiter", ExperienceLevel.LOW));
    employees.add(new Employee("Fabrizio", "waiter", ExperienceLevel.LOW));
    employees.add(new Employee("Amnir", "waiter", ExperienceLevel.LOW));
    employees.add(new Employee("Abel", "barman", ExperienceLevel.LOW));

    restaurant.setBudget(10000);
    employee.increaseExperience(employees, 1, "Luciano");
    Mockito.verify(out).println("The chef experience level increased");
    Assert.assertEquals(8800, restaurant.getBudget());
}

Employee 类中的 increaseExperience 方法是:

public void increaseExperience(ArrayList<Employee> employees,
        int numberOfEmployee, String employeeName) {
    restaurant = new Restaurant();
    String[] parts = employeeName.split(",");
    for (int i = 0; i < numberOfEmployee; i++) 
    {
        for (int a = 0; a < employees.size(); a++) 
        {
            if (employees.get(a).name.equals(parts[i])) 
            {
                if (employees.get(a).job.equals("chef") || employees.get(a).job.equals("barman")) 
                {
                    if (employees.get(a).experience.equals(ExperienceLevel.LOW) || employees.get(a).experience.equals(ExperienceLevel.MEDIUM)) 
                    {
                        if (restaurant.getBudget() >= 1200) 
                        {
                            restaurant.setBudget(restaurant.getBudget() - 1200);
                            if (i == 0)
                                System.out.println("The " + employees.get(a).job + " experience level is increased");
                            else
                                System.out.println(" and the " + employees.get(a).job + " experience level is increased");
                        } 
                        else 
                        {
                            if (i == 0)
                                System.out.println("The " + employees.get(a).job + " experience level is failed to increase");
                            else
                                System.out.println(" and the " + employees.get(a).job + " experience level is failed to increase");
                        }
                    } 
                    else if (employees.get(a).experience.equals(ExperienceLevel.HIGH)) 
                    {
                        if (i == 0)
                            System.out.println("The " + employees.get(a).job + " experience level is increased");
                        else
                            System.out.println(" and the " + employees.get(a).job + " experience level is increased");
                    }
                } 
                else if (employees.get(a).job.equals("waiter")) 
                {
                    if (employees.get(a).experience.equals(ExperienceLevel.LOW) || employees.get(a).experience.equals(ExperienceLevel.MEDIUM)) 
                    {
                        if (restaurant.getBudget() >= 800) 
                        {
                            restaurant.setBudget(restaurant.getBudget() - 800);
                            if (i == 0)
                                System.out.println("The " + employees.get(a).job + " experience level is increased");
                            else
                                System.out.println(" and the " + employees.get(a).job + " experience level is increased");
                        } 
                        else 
                        {
                            if (i == 0)
                                System.out.println("The " + employees.get(a).job + " experience level is failed to increase");
                            else
                                System.out.println(" and the " + employees.get(a).job + " experience level is failed to increase");
                        }
                    } 
                    else if (employees.get(a).experience.equals(ExperienceLevel.HIGH)) 
                    {
                        if (i == 0)
                            System.out.println("The " + employees.get(a).job + " experience level is increased");
                        else
                            System.out.println(" and the " + employees.get(a).job + " experience level is increased");
                    }
                }
            }
        }
    }
}

但是当我在我的 JUnit 测试方法中将预算设置为 10000 时,我无法将其恢复为 8800。但是我还是得到10000。可能是调用increaseExperience方法失败。

我该如何解决?

谢谢。

【问题讨论】:

  • 这似乎更有可能是您调用的代码中的错误。我建议你停止嘲笑System.out - 然后你会得到你的调试日志......此外,你应该在调试器中单步调试代码。
  • 我认为你应该得到 ArrayIndexOutOfBoundException?
  • 但是乔恩,当我忽略嘲笑时,我仍然无法得到 8800。它并没有减少任何东西。
  • 没有 Almas,当我使用 Mockito 时,参数是不同的。当我忽略嘲笑时,我没有得到 8800
  • @yeniden:“它不会减少任何东西”——它会为您提供调试信息!如果您随后在测试中将它们关闭,即使您不了解发生了什么,那么拥有所有这些 System.out.println 行有什么意义?它本身并不能解决问题,但它可以帮助您找到问题。

标签: java junit


【解决方案1】:

这就是问题所在,就在您的 increaseExperience 方法的开头:

restaurant = new Restaurant();

您在该方法中使用的餐厅与测试中的餐厅完全不同。

也许您应该将餐厅作为另一个参数传递?或者员工应该知道他们工作的餐厅?

(也不清楚为什么你在没有有用信息的情况下在Employee 上调用increaseExperience - 听起来它应该是Employee 上的实例方法没有您传入员工,或者它应该是Restaurant 上的实例方法,此时您应该删除restuarant 变量,或者它应该是Employee 上的静态 方法作用于许多员工,而不仅仅是一个……从根本上说,我认为你需要重新审视你的设计。)

【讨论】:

  • 其实我唯一想做的就是提高餐厅员工的经验水平。所以我必须首先在餐厅检查预算,这样我才能提高或不提高水平。如果我不打电话给餐厅,我就无法获得预算。
  • @yeniden:我认为你完全没有理解我的意思。您在方法开始时创建了一个 new 餐厅。假设每个Restaurant 都有单独的预算,您如何期望您在方法开始时创建的餐厅与您在测试中创建的餐厅有任何关系? (正如我在回答中所说,我也强烈建议您重新审视您的设计......)
  • Jon,现在我在方法外部创建了新的 Restaurant() 实例。但我仍然得到同样的错误。
  • @yeniden:这听起来仍然不像Employee 中的实例与您在测试中创建的实例有任何关系。恐怕我没有时间进一步帮助您 - 我已经解释了问题所在,给出了修复它的选项,解释了设计缺陷,并为您提供了两种不同的改进诊断方法(日志记录和调试)的提示......恐怕你必须自己做剩下的事情。
猜你喜欢
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多