gpt4 book ai didi

java - 当运行两个具有相同变量名的测试时,JUnit 失败

转载 作者:行者123 更新时间:2023-11-30 06:50:42 27 4
gpt4 key购买 nike

我为我的类(class)编写了以下测试:

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>

但是当我分别运行这两个测试时,两个测试都通过了。解决方案是为 schedule1schedule2 更改 Schedule schedule = new Schedule(); 的名称。然后,再一次,两者都通过了。

为什么会这样?

编辑以下是 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();一个一个,那么我的意思是 created 的顺序是不同的,但不是。我需要手动设置属性,然后它才能工作。

我很抱歉!

最佳答案

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

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

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

关于java - 当运行两个具有相同变量名的测试时,JUnit 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41096460/

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