您好我试图运行我的功能并测试它认为junit测试但我无法弄清楚为什么我的junit测试失败。我确定我写的功能有效。如果有人想知道这是功课。
这是测试
@Test
public void test4() {
lst1.removeAll(3);
assertEquals(8, lst1.size());
assertEquals(false, lst1.contains(3));
lst1.removeAll(6);
assertEquals(5, lst1.size());
assertEquals(false, lst1.contains(6));
lst1.removeAll(5);
assertEquals(3, lst1.size());
lst1.removeAll(4);
assertEquals(2, lst1.size());
lst1.removeAll(7);
assertEquals(1, lst1.size());
lst1.removeAll(8);
assertEquals(0, lst1.size());
}
这是代码
public void removeAll( E x ) {
first = first.next;
if (first.data == x ) {
first = first.next;
}
Node curr = first;
Node fut = curr.next ;
while ( fut!= null) {
if (fut.data == x ) {
curr.next = fut.next;
}
curr=curr.next;
fut=fut.next;
}
assert check();
}
设置junit
public class MyListTest {
private MyList<Integer> lst0;
private MyList<Integer> lst1;
private Integer[] a;
@Before
public void setUp() throws Exception {
lst0 = new MyList<Integer>();
a = new Integer[] {3,4,3,5,6,8,6,6,7,5};
lst1 = new MyList<Integer>();
for(Integer x: a) {
lst1.add(x);
}
}
尺寸方法
public int size() {
return sz;
}
主要方法
public class MyList<E extends Comparable< E>> implements Iterable<E> {
private Node first;
private int sz;
public MyList() {
first = null;
sz = 0;
assert check();
}
}
检查方法
private boolean check()
{
if (first == null && sz != 0) return false;
if (sz == 0 && first != null) return false;
if (sz == 1 && (first == null || first.next != null)) return false;
if (sz > 1 && (first == null || first.next == null)) return false;
int count = 0;
Node p = first;
while(p != null) {
count++;
p = p.next;
}
if (count != sz) {
System.out.printf("count = %d, sz = %d\n", count, sz);
return false;
}
return true;
}
答案 0 :(得分:0)
如果你完全陷入困境,你可以考虑从头开始,以更小但更安全的步骤再次前进。
从一个简单的测试开始:
@Test
public void testConstruct() {
MyNewList<Integer> myNewList = new MyNewList<Integer>();
assertNotNull(myNewList);
assertEquals(0, myNewList.size());
}
现在在MyNewList
中编写足够的代码来通过测试 - 不想到复杂的结构,最简单的解决方案就足够了 - 甚至return 0;
的{{1}}没问题。
如果你的代码最终通过测试,你可以写另一个:
size()
再次实现足够的代码来传递两个测试。一旦您成功改变测试以检查您的解决方案是否也适用于其他参数:
@Test
public void testAdd() {
MyNewList<Integer> myNewList = new MyNewList<Integer>();
myNewList.add(5);
assertEquals(1, myNewList.size());
}
现在您可以相信您的@Test
public void testAdd() {
MyNewList<Integer> myNewList = new MyNewList<Integer>();
myNewList.add(5);
assertEquals(1, myNewList.size());
myNewList.add(7);
assertEquals(2, myNewList.size());
}
方法并决定下一步该做什么:短暂休息并清理您的代码或组织您的课程的内部结构,或者前进到您的旅程的下一个目的地?
当你最终继续下去时,你必须解决下一个难题:
add()
现在再次编写足够的代码来传递所有测试。现在你甚至可以用这种方式实现你的方法:
@Test
public void testRemoveAll() {
MyNewList<Integer> myNewList = new MyNewList<Integer>();
myNewList.add(5);
myNewList.add(5);
myNewList.add(7);
myNewList.add(3);
assertEquals(4, myNewList.size());
myNewList.removeAll(3);
assertEquals(3, myNewList.size());
}
这可能是因为它完全满足上述测试所描述的要求。现在让我们面对你的方法进行更严格的检查并改变测试:
public void removeAll(T element) {
size--;
}
如果您之前选择了一个简单的解决方案,那么您现在可能“陷入困境”;)因此,再次考虑您的@Test
public void testRemoveAll() {
MyNewList<Integer> myNewList = new MyNewList<Integer>();
myNewList.add(5);
myNewList.add(5);
myNewList.add(7);
myNewList.add(3);
assertEquals(4, myNewList.size());
myNewList.removeAll(3);
assertEquals(3, myNewList.size());
myNewList.removeAll(5);
assertEquals(1, myNewList.size());
}
方法并扩展其代码,直到它再次通过测试。
完成此操作后,您可以放心,您的代码可以正常工作。
如果你改变课程中的某些内容,请再次运行测试以查看是否有某些内容被破坏。
如果对方法必须改变的方式有所改变 - 更改测试以反映新要求并再次运行它们。
乍一看这看起来似乎很乏味但是一旦你对测试设置有了坚实的基础,你就可以说:“我的代码确实正是如何工作”