我为我的课程编写了以下测试:
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()
是不同的,但不是。我需要手动设置属性,然后才能工作。
我很抱歉!
答案 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();
}