运行两个具有相同变量名称的测试时,JUnit失败执行

时间:2016-12-12 08:02:46

标签: java maven intellij-idea junit jodatime

我为我的课程编写了以下测试:

import org.junit.After;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class ScheduleUnitTest {
    private DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy HH:mm");

    @Test
    public void test1() {
        // Available 8:00 - 18:00
        // Break 12:00 - 12:30
        Schedule schedule = new Schedule();
        ScheduleElement element;

        element = new ScheduleElement();
        element.setType(EventType.AVAILABLE);
        element.setBegin(getDate("20-08-2014 08:00"));
        element.setEnd(getDate("20-08-2014 18:00"));
        schedule.addElement(element);

        element = new ScheduleElement();
        element.setType(EventType.UNAVAILABLE);
        element.setBegin(getDate("20-08-2014 12:00"));
        element.setEnd(getDate("20-08-2014 12:30"));
        schedule.addElement(element);

        schedule.make();

        assertThat(schedule.isAvailable(getDate("20-08-2014 12:10"), getDate("20-08-2014 12:20"))).isFalse();
    }

    @Test
    public void test2() {
        // Available 8:00 - 18:00
        // Break 12:00 - 12:30
        Schedule schedule = new Schedule();
        ScheduleElement element;

        element = new ScheduleElement();
        element.setType(EventType.AVAILABLE);
        element.setBegin(getDate("20-08-2014 08:00"));
        element.setEnd(getDate("20-08-2014 18:00"));
        schedule.addElement(element);

        element = new ScheduleElement();
        element.setType(EventType.UNAVAILABLE);
        element.setBegin(getDate("20-08-2014 12:00"));
        element.setEnd(getDate("20-08-2014 13:30"));
        schedule.addElement(element);

        element = new ScheduleElement();
        element.setType(EventType.AVAILABLE);
        element.setBegin(getDate("20-08-2014 12:30"));
        element.setEnd(getDate("20-08-2014 13:30"));
        schedule.addElement(element);

        schedule.make();

        assertThat(schedule.isAvailable(getDate("20-08-2014 12:10"), getDate("20-08-2014 12:20"))).isFalse();
    }

    private LocalDateTime getDate(String date) {
        return LocalDateTime.parse(date, formatter);
    }

}

当我运行两个测试时,其中一个总是失败。它说:

test2(org.example.ScheduleUnitTest)  Time elapsed: 0.011 sec  <<< FAILURE!
org.junit.ComparisonFailure: expected:<[fals]e> but was:<[tru]e>

但是当我分开运行时,两个测试都通过了。解决方案是更改Schedule schedule = new Schedule();schedule1的{​​{1}}名称。然后,再次,两个通过。

为什么它会那样工作?

修改 以下是schedule2类的源代码:

Schedule

解决

问题出在其他地方:import org.joda.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Schedule { private List<ScheduleElement> elements = new ArrayList<ScheduleElement>(); public void make() { // sorted ASC Collections.sort(elements, new Comparator<ScheduleElement>() { public int compare(ScheduleElement o1, ScheduleElement o2) { return o2.getCreated().compareTo(o1.getCreated()); } }); } public boolean isAvailable(LocalDateTime begin, LocalDateTime end) { for(ScheduleElement scheduleElement : elements) { if(scheduleElement.isOccurring(begin, end)) { if(scheduleElement.getType() == EventType.AVAILABLE) { if(!begin.isBefore(scheduleElement.getBegin()) && !end.isAfter(scheduleElement.getEnd())) { return true; } } return false; } } return false; } public boolean isOccurring(LocalDateTime date, EventType type) { for(ScheduleElement scheduleElement : elements) { if(scheduleElement.isOccurring(date, type)) { return true; } } return false; } public void dates(LocalDateTime begin, LocalDateTime end) { } public void dates(LocalDateTime begin, LocalDateTime end, EventType eventType) { } public void addElement(ScheduleElement element) { elements.add(element); } public List<ScheduleElement> getElements() { return elements; } public void setElements(List<ScheduleElement> elements) { this.elements = elements; } } schedule.make()。它以错误的方式排序数组。 Collections.sort有财产

ScheduleElement

如果我放private LocalDateTime created = LocalDateTime.now(); ,通常并不意味着什么。一个接一个,我的意思是命令element = new ScheduleElement()是不同的,但不是。我需要手动设置属性,然后才能工作。

我很抱歉!

2 个答案:

答案 0 :(得分:4)

我不认为Schedule的代码是问题,因为您在测试中本地实例化它,并且在线程之间没有静态数据共享。我相信这个问题可能是你在测试类中解析日期本身,当测试并行运行时,它会并行执行。请尝试对getDate() ::

进行以下更改
private LocalDateTime getDate(String date) {
    synchronized (LocalDateTime.class) {
        return LocalDateTime.parse(date, formatter);
    }
}

这将确保在JVM中不会同时发生对parse()的两次调用。

答案 1 :(得分:0)

对单元测试进行以下更改,这可能会解决您的问题。

  • 添加@Before方法(setup)并在其中初始化schedule

所以测试会变成这样......

private Schedule schedule;

@Before
public void setUp() throws Exception {
    schedule = new Schedule();
}

@Test
public void test1() {
   // setting values go here.

     schedule.make();
}