/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.harmony.luni.tests.java.util; //import dalvik.annotation.TestTargets; //import dalvik.annotation.TestLevel; //import dalvik.annotation.TestTargetNew; //import dalvik.annotation.TestTargetClass; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import tests.support.Support_MapTest2; import tests.support.Support_UnmodifiableCollectionTest; /** * @tests java.util.LinkedHashMap */ //@TestTargetClass(LinkedHashMap.class) public class LinkedHashMapTest extends junit.framework.TestCase { LinkedHashMap hm; final static int hmSize = 1000; static Object[] objArray; static Object[] objArray2; { objArray = new Object[hmSize]; objArray2 = new Object[hmSize]; for (int i = 0; i < objArray.length; i++) { objArray[i] = new Integer(i); objArray2[i] = objArray[i].toString(); } } static final class CacheMap extends LinkedHashMap { protected boolean removeEldestEntry(Map.Entry e) { return size() > 5; } } private static class MockMapNull extends AbstractMap { @Override public Set entrySet() { return null; } @Override public int size() { return 10; } } /** * @tests java.util.LinkedHashMap#LinkedHashMap() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "LinkedHashMap", args = {} ) */ public void test_Constructor() { // Test for method java.util.LinkedHashMap() new Support_MapTest2(new LinkedHashMap()).runTest(); LinkedHashMap hm2 = new LinkedHashMap(); assertEquals("Created incorrect LinkedHashMap", 0, hm2.size()); } /** * @tests java.util.LinkedHashMap#LinkedHashMap(int) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "LinkedHashMap", args = {int.class} ) */ public void test_ConstructorI() { // Test for method java.util.LinkedHashMap(int) LinkedHashMap hm2 = new LinkedHashMap(5); assertEquals("Created incorrect LinkedHashMap", 0, hm2.size()); try { new LinkedHashMap(-1); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { //expected } LinkedHashMap empty = new LinkedHashMap(0); assertNull("Empty LinkedHashMap access", empty.get("nothing")); empty.put("something", "here"); assertTrue("cannot get element", empty.get("something") == "here"); } /** * @tests java.util.LinkedHashMap#LinkedHashMap(int, float) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "LinkedHashMap", args = {int.class, float.class} ) */ public void test_ConstructorIF() { // Test for method java.util.LinkedHashMap(int, float) LinkedHashMap hm2 = new LinkedHashMap(5, (float) 0.5); assertEquals("Created incorrect LinkedHashMap", 0, hm2.size()); try { new LinkedHashMap(0, 0); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { //expected } LinkedHashMap empty = new LinkedHashMap(0, 0.75f); assertNull("Empty hashtable access", empty.get("nothing")); empty.put("something", "here"); assertTrue("cannot get element", empty.get("something") == "here"); } /** * @tests java.util.LinkedHashMap#LinkedHashMap(java.util.Map) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "LinkedHashMap", args = {java.util.Map.class} ) */ public void test_ConstructorLjava_util_Map() { // Test for method java.util.LinkedHashMap(java.util.Map) Map myMap = new TreeMap(); for (int counter = 0; counter < hmSize; counter++) myMap.put(objArray2[counter], objArray[counter]); LinkedHashMap hm2 = new LinkedHashMap(myMap); for (int counter = 0; counter < hmSize; counter++) assertTrue("Failed to construct correct LinkedHashMap", hm .get(objArray2[counter]) == hm2.get(objArray2[counter])); try { new LinkedHashMap(null); fail("NullPointerException expected"); } catch (NullPointerException e) { //expected } } /** * @tests java.util.LinkedHashMap#get(java.lang.Object) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "get", args = {java.lang.Object.class} ) */ public void test_getLjava_lang_Object() { // Test for method java.lang.Object // java.util.LinkedHashMap.get(java.lang.Object) assertNull("Get returned non-null for non existent key", hm.get("T")); hm.put("T", "HELLO"); assertEquals("Get returned incorecct value for existing key", "HELLO", hm.get("T") ); LinkedHashMap m = new LinkedHashMap(); m.put(null, "test"); assertEquals("Failed with null key", "test", m.get(null)); assertNull("Failed with missing key matching null hash", m .get(new Integer(0))); } /** * @tests java.util.LinkedHashMap#put(java.lang.Object, java.lang.Object) @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "", method = "put", args = {java.lang.Object.class, java.lang.Object.class} ) */ public void test_putLjava_lang_ObjectLjava_lang_Object() { // Test for method java.lang.Object // java.util.LinkedHashMap.put(java.lang.Object, java.lang.Object) hm.put("KEY", "VALUE"); assertEquals("Failed to install key/value pair", "VALUE", hm.get("KEY")); LinkedHashMap m = new LinkedHashMap(); m.put(new Short((short) 0), "short"); m.put(null, "test"); m.put(new Integer(0), "int"); assertEquals("Failed adding to bucket containing null", "short", m.get( new Short((short) 0))); assertEquals("Failed adding to bucket containing null2", "int", m.get( new Integer(0))); } /** * @tests java.util.LinkedHashMap#putAll(java.util.Map) @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies only positive functionality.", method = "putAll", args = {java.util.Map.class} ) */ public void test_putAllLjava_util_Map() { // Test for method void java.util.LinkedHashMap.putAll(java.util.Map) LinkedHashMap hm2 = new LinkedHashMap(); hm2.putAll(hm); for (int i = 0; i < 1000; i++) assertTrue("Failed to clear all elements", hm2.get( new Integer(i).toString()).equals((new Integer(i)))); } /** * @tests java.util.LinkedHashMap#putAll(java.util.Map) @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Verifies NullPointerException.", method = "putAll", args = {java.util.Map.class} ) */ public void test_putAll_Ljava_util_Map_Null() { LinkedHashMap linkedHashMap = new LinkedHashMap(); try { linkedHashMap.putAll(new MockMapNull()); fail("Should throw NullPointerException"); } catch (NullPointerException e) { // expected. } try { linkedHashMap = new LinkedHashMap(new MockMapNull()); fail("Should throw NullPointerException"); } catch (NullPointerException e) { // expected. } } /** * @tests java.util.LinkedHashMap#entrySet() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "entrySet", args = {} ) */ public void test_entrySet() { // Test for method java.util.Set java.util.LinkedHashMap.entrySet() Set s = hm.entrySet(); Iterator i = s.iterator(); assertTrue("Returned set of incorrect size", hm.size() == s.size()); while (i.hasNext()) { Map.Entry m = (Map.Entry) i.next(); assertTrue("Returned incorrect entry set", hm.containsKey(m .getKey()) && hm.containsValue(m.getValue())); } } /** * @tests java.util.LinkedHashMap#keySet() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "keySet", args = {} ) */ public void test_keySet() { // Test for method java.util.Set java.util.LinkedHashMap.keySet() Set s = hm.keySet(); assertTrue("Returned set of incorrect size()", s.size() == hm.size()); for (int i = 0; i < objArray.length; i++) assertTrue("Returned set does not contain all keys", s .contains(objArray[i].toString())); LinkedHashMap m = new LinkedHashMap(); m.put(null, "test"); assertTrue("Failed with null key", m.keySet().contains(null)); assertNull("Failed with null key", m.keySet().iterator().next()); Map map = new LinkedHashMap(101); map.put(new Integer(1), "1"); map.put(new Integer(102), "102"); map.put(new Integer(203), "203"); Iterator it = map.keySet().iterator(); Integer remove1 = (Integer) it.next(); it.hasNext(); it.remove(); Integer remove2 = (Integer) it.next(); it.remove(); ArrayList list = new ArrayList(Arrays.asList(new Integer[] { new Integer(1), new Integer(102), new Integer(203) })); list.remove(remove1); list.remove(remove2); assertTrue("Wrong result", it.next().equals(list.get(0))); assertEquals("Wrong size", 1, map.size()); assertTrue("Wrong contents", map.keySet().iterator().next().equals( list.get(0))); Map map2 = new LinkedHashMap(101); map2.put(new Integer(1), "1"); map2.put(new Integer(4), "4"); Iterator it2 = map2.keySet().iterator(); Integer remove3 = (Integer) it2.next(); Integer next; if (remove3.intValue() == 1) next = new Integer(4); else next = new Integer(1); it2.hasNext(); it2.remove(); assertTrue("Wrong result 2", it2.next().equals(next)); assertEquals("Wrong size 2", 1, map2.size()); assertTrue("Wrong contents 2", map2.keySet().iterator().next().equals( next)); } /** * @tests java.util.LinkedHashMap#values() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "values", args = {} ) */ public void test_values() { // Test for method java.util.Collection java.util.LinkedHashMap.values() Collection c = hm.values(); assertTrue("Returned collection of incorrect size()", c.size() == hm .size()); for (int i = 0; i < objArray.length; i++) assertTrue("Returned collection does not contain all keys", c .contains(objArray[i])); LinkedHashMap myLinkedHashMap = new LinkedHashMap(); for (int i = 0; i < 100; i++) myLinkedHashMap.put(objArray2[i], objArray[i]); Collection values = myLinkedHashMap.values(); new Support_UnmodifiableCollectionTest( "Test Returned Collection From LinkedHashMap.values()", values) .runTest(); values.remove(new Integer(0)); assertTrue( "Removing from the values collection should remove from the original map", !myLinkedHashMap.containsValue(new Integer(0))); } /** * @tests java.util.LinkedHashMap#remove(java.lang.Object) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "remove", args = {java.lang.Object.class} ) */ public void test_removeLjava_lang_Object() { // Test for method java.lang.Object // java.util.LinkedHashMap.remove(java.lang.Object) int size = hm.size(); Integer y = new Integer(9); Integer x = ((Integer) hm.remove(y.toString())); assertTrue("Remove returned incorrect value", x.equals(new Integer(9))); assertNull("Failed to remove given key", hm.get(new Integer(9))); assertTrue("Failed to decrement size", hm.size() == (size - 1)); assertNull("Remove of non-existent key returned non-null", hm .remove("LCLCLC")); LinkedHashMap m = new LinkedHashMap(); m.put(null, "test"); assertNull("Failed with same hash as null", m.remove(new Integer(0))); assertEquals("Failed with null key", "test", m.remove(null)); } /** * @tests java.util.LinkedHashMap#clear() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "clear", args = {} ) */ public void test_clear() { // Test for method void java.util.LinkedHashMap.clear() hm.clear(); assertEquals("Clear failed to reset size", 0, hm.size()); for (int i = 0; i < hmSize; i++) assertNull("Failed to clear all elements", hm.get(objArray2[i])); } /** * @tests java.util.LinkedHashMap#clone() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "clone", args = {} ) */ public void test_clone() { // Test for method java.lang.Object java.util.LinkedHashMap.clone() LinkedHashMap hm2 = (LinkedHashMap) hm.clone(); assertTrue("Clone answered equivalent LinkedHashMap", hm2 != hm); for (int counter = 0; counter < hmSize; counter++) assertTrue("Clone answered unequal LinkedHashMap", hm .get(objArray2[counter]) == hm2.get(objArray2[counter])); LinkedHashMap map = new LinkedHashMap(); map.put("key", "value"); // get the keySet() and values() on the original Map Set keys = map.keySet(); Collection values = map.values(); assertEquals("values() does not work", "value", values.iterator().next()); assertEquals("keySet() does not work", "key", keys.iterator().next()); AbstractMap map2 = (AbstractMap) map.clone(); map2.put("key", "value2"); Collection values2 = map2.values(); assertTrue("values() is identical", values2 != values); // values() and keySet() on the cloned() map should be different assertEquals("values() was not cloned", "value2", values2.iterator().next()); map2.clear(); map2.put("key2", "value3"); Set key2 = map2.keySet(); assertTrue("keySet() is identical", key2 != keys); assertEquals("keySet() was not cloned", "key2", key2.iterator().next()); } /** * @tests java.util.LinkedHashMap#containsKey(java.lang.Object) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "containsKey", args = {java.lang.Object.class} ) */ public void test_containsKeyLjava_lang_Object() { // Test for method boolean // java.util.LinkedHashMap.containsKey(java.lang.Object) assertTrue("Returned false for valid key", hm.containsKey(new Integer( 876).toString())); assertTrue("Returned true for invalid key", !hm.containsKey("KKDKDKD")); LinkedHashMap m = new LinkedHashMap(); m.put(null, "test"); assertTrue("Failed with null key", m.containsKey(null)); assertTrue("Failed with missing key matching null hash", !m .containsKey(new Integer(0))); } /** * @tests java.util.LinkedHashMap#containsValue(java.lang.Object) @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "containsValue", args = {java.lang.Object.class} ) */ public void test_containsValueLjava_lang_Object() { // Test for method boolean // java.util.LinkedHashMap.containsValue(java.lang.Object) assertTrue("Returned false for valid value", hm .containsValue(new Integer(875))); assertTrue("Returned true for invalid valie", !hm .containsValue(new Integer(-9))); } /** * @tests java.util.LinkedHashMap#isEmpty() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "isEmpty", args = {} ) */ public void test_isEmpty() { // Test for method boolean java.util.LinkedHashMap.isEmpty() assertTrue("Returned false for new map", new LinkedHashMap().isEmpty()); assertTrue("Returned true for non-empty", !hm.isEmpty()); } /** * @tests java.util.LinkedHashMap#size() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "size", args = {} ) */ public void test_size() { // Test for method int java.util.LinkedHashMap.size() assertTrue("Returned incorrect size", hm.size() == (objArray.length + 2)); } /** * @tests java.util.LinkedHashMap#entrySet() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "entrySet", args = {} ) */ public void test_ordered_entrySet() { int i; int sz = 100; LinkedHashMap lhm = new LinkedHashMap(); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lhm.put(ii, ii.toString()); } Set s1 = lhm.entrySet(); Iterator it1 = s1.iterator(); assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size()); for (i = 0; it1.hasNext(); i++) { Map.Entry m = (Map.Entry) it1.next(); Integer jj = (Integer) m.getKey(); assertTrue("Returned incorrect entry set 1", jj.intValue() == i); } LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lruhm.put(ii, ii.toString()); } Set s3 = lruhm.entrySet(); Iterator it3 = s3.iterator(); assertTrue("Returned set of incorrect size 2", lruhm.size() == s3 .size()); for (i = 0; i < sz && it3.hasNext(); i++) { Map.Entry m = (Map.Entry) it3.next(); Integer jj = (Integer) m.getKey(); assertTrue("Returned incorrect entry set 2", jj.intValue() == i); } /* fetch the even numbered entries to affect traversal order */ int p = 0; for (i = 0; i < sz; i += 2) { String ii = (String) lruhm.get(new Integer(i)); p = p + Integer.parseInt(ii); } assertEquals("invalid sum of even numbers", 2450, p); Set s2 = lruhm.entrySet(); Iterator it2 = s2.iterator(); assertTrue("Returned set of incorrect size 3", lruhm.size() == s2 .size()); for (i = 1; i < sz && it2.hasNext(); i += 2) { Map.Entry m = (Map.Entry) it2.next(); Integer jj = (Integer) m.getKey(); assertTrue("Returned incorrect entry set 3", jj.intValue() == i); } for (i = 0; i < sz && it2.hasNext(); i += 2) { Map.Entry m = (Map.Entry) it2.next(); Integer jj = (Integer) m.getKey(); assertTrue("Returned incorrect entry set 4", jj.intValue() == i); } assertTrue("Entries left to iterate on", !it2.hasNext()); } /** * @tests java.util.LinkedHashMap#keySet() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "keySet", args = {} ) */ public void test_ordered_keySet() { int i; int sz = 100; LinkedHashMap lhm = new LinkedHashMap(); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lhm.put(ii, ii.toString()); } Set s1 = lhm.keySet(); Iterator it1 = s1.iterator(); assertTrue("Returned set of incorrect size", lhm.size() == s1.size()); for (i = 0; it1.hasNext(); i++) { Integer jj = (Integer) it1.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i); } LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lruhm.put(ii, ii.toString()); } Set s3 = lruhm.keySet(); Iterator it3 = s3.iterator(); assertTrue("Returned set of incorrect size", lruhm.size() == s3.size()); for (i = 0; i < sz && it3.hasNext(); i++) { Integer jj = (Integer) it3.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i); } /* fetch the even numbered entries to affect traversal order */ int p = 0; for (i = 0; i < sz; i += 2) { String ii = (String) lruhm.get(new Integer(i)); p = p + Integer.parseInt(ii); } assertEquals("invalid sum of even numbers", 2450, p); Set s2 = lruhm.keySet(); Iterator it2 = s2.iterator(); assertTrue("Returned set of incorrect size", lruhm.size() == s2.size()); for (i = 1; i < sz && it2.hasNext(); i += 2) { Integer jj = (Integer) it2.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i); } for (i = 0; i < sz && it2.hasNext(); i += 2) { Integer jj = (Integer) it2.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i); } assertTrue("Entries left to iterate on", !it2.hasNext()); } /** * @tests java.util.LinkedHashMap#values() @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "values", args = {} ) */ public void test_ordered_values() { int i; int sz = 100; LinkedHashMap lhm = new LinkedHashMap(); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lhm.put(ii, new Integer(i * 2)); } Collection s1 = lhm.values(); Iterator it1 = s1.iterator(); assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size()); for (i = 0; it1.hasNext(); i++) { Integer jj = (Integer) it1.next(); assertTrue("Returned incorrect entry set 1", jj.intValue() == i * 2); } LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lruhm.put(ii, new Integer(i * 2)); } Collection s3 = lruhm.values(); Iterator it3 = s3.iterator(); assertTrue("Returned set of incorrect size", lruhm.size() == s3.size()); for (i = 0; i < sz && it3.hasNext(); i++) { Integer jj = (Integer) it3.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i * 2); } // fetch the even numbered entries to affect traversal order int p = 0; for (i = 0; i < sz; i += 2) { Integer ii = (Integer) lruhm.get(new Integer(i)); p = p + ii.intValue(); } assertTrue("invalid sum of even numbers", p == 2450 * 2); Collection s2 = lruhm.values(); Iterator it2 = s2.iterator(); assertTrue("Returned set of incorrect size", lruhm.size() == s2.size()); for (i = 1; i < sz && it2.hasNext(); i += 2) { Integer jj = (Integer) it2.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i * 2); } for (i = 0; i < sz && it2.hasNext(); i += 2) { Integer jj = (Integer) it2.next(); assertTrue("Returned incorrect entry set", jj.intValue() == i * 2); } assertTrue("Entries left to iterate on", !it2.hasNext()); } /** * @tests java.util.LinkedHashMap#removeEldestEntry(java.util.Map$Entry) @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "Doesn't verify null as a parameter.", method = "removeEldestEntry", args = {java.util.Map.Entry.class} ) */ public void test_remove_eldest() { int i; int sz = 10; CacheMap lhm = new CacheMap(); for (i = 0; i < sz; i++) { Integer ii = new Integer(i); lhm.put(ii, new Integer(i * 2)); } Collection s1 = lhm.values(); Iterator it1 = s1.iterator(); assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size()); for (i = 5; it1.hasNext(); i++) { Integer jj = (Integer) it1.next(); assertTrue("Returned incorrect entry set 1", jj.intValue() == i * 2); } assertTrue("Entries left in map", !it1.hasNext()); } /* @TestTargets({ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "LinkedHashMap", args = {int.class, float.class, boolean.class} ), @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "put", args = {java.lang.Object.class, java.lang.Object.class} ) }) */ // BEGIN android-added public void testLinkedHashMap() { // we want to test the LinkedHashMap in access ordering mode. LinkedHashMap map = new LinkedHashMap<String, String>(10, 0.75f, true); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); Iterator iterator = map.keySet().iterator(); String id = (String) iterator.next(); map.get(id); try { iterator.next(); // A LinkedHashMap is supposed to throw this Exception when a // iterator.next() Operation takes place after a get // Operation. This is because the get Operation is considered // a structural modification if the LinkedHashMap is in // access order mode. fail("expected ConcurrentModificationException was not thrown."); } catch(ConcurrentModificationException e) { // expected } LinkedHashMap mapClone = (LinkedHashMap) map.clone(); iterator = map.keySet().iterator(); id = (String) iterator.next(); mapClone.get(id); try { iterator.next(); } catch(ConcurrentModificationException e) { fail("expected ConcurrentModificationException was not thrown."); } try { new LinkedHashMap<String, String>(-10, 0.75f, true); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { //expected } try { new LinkedHashMap<String, String>(10, -0.75f, true); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException e) { //expected } } // END android-added /** * Sets up the fixture, for example, open a network connection. This method * is called before a test is executed. */ protected void setUp() { hm = new LinkedHashMap(); for (int i = 0; i < objArray.length; i++) hm.put(objArray2[i], objArray[i]); hm.put("test", null); hm.put(null, "test"); } /** * Tears down the fixture, for example, close a network connection. This * method is called after a test is executed. */ protected void tearDown() { } }