Code Block |
---|
public class Meal {
...
/**
* Finds a Course satisfying the provided Predicate.
* @param test
* @return the first Course satisfying the provided Predicate.
*/
public Course findCourse(Predicate<Course> test) {
... what should be done here? ...
}
}
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
* @param t the input argument
* @return true if the input argument matches the predicate, otherwise false
*/
boolean test(T t);
}
public class MealTest extends TestCase {
private Course c1, c2;
private Meal meal;
@Override
protected void setUp() throws Exception {
... what should be done here? ...
}
/**
* Tests Meal's support for foreach loop (iteration)
*/
public void testIteration() {
... test code ...
}
/**
* Tests Meal's findCourse(Prediate) method
*/
public void testFindCourse() {
... test code ...
}
} |
Oppgave a) Predicate-grensesnittetHva kalles et slikt grensesnitt som Predicate (se utgitt kode) og hvorfor? Expand |
---|
| Dette er et såkalt funksjonelt grensesnitt, siden det har én metode som (er ment som å) oppfører seg som en matematisk funksjon. |
Oppgave b) findCourse-metodenMeal skal utvides med en metode for å finne Course-objekter som tilfredsstiller gitte betingelser. For å gjør koden generell så gis betingelsen inn som argument i form av et Predicate-objekt (se utgitt kode). Fullfør findCourse-metoden (se utgitt kode). Expand |
---|
| Vi må løpe gjennom course-lista og returnere det første Course-objektet som Predicate-objektet svarer true for. Code Block |
---|
public Course findCourse(Predicate<Course> test) {
for (Course course : courses) {
if (test.test(course)) {
return course;
}
}
return null;
} |
|
Oppgave c) Testing av MealDen utgitte koden inneholder en JUnit-test for testing av Meal-klassen. To typer funksjonalitet skal testes, 1) metoden(e) for å støtte iterasjon vha. foreach-løkker og 2) findCourse-metoden. Fullfør koden. Hvis du ikke får til å skrive riktig kode for JUnit-rammeverket, så forklar med tekst og kode hvordan du ville gjort det. Expand |
---|
| setUp-metoden brukes for initialisering av objektene som brukes i testene. Code Block |
---|
protected void setUp() throws Exception {
c1 = new Course("c1", "c1");
c2 = new Course("c2", "c2");
meal = new Meal("test", "test", new Course[]{ c1, c2});
} |
For å teste iterasjon med foreach-løkker, må vi bruke metoden som en slik løkke (implisitt) bruker, nemlig iterator()-metoden og Iterator-objektet som denne returnerer. Her brukes objektene som er rigget opp i setUp-metoden. Code Block |
---|
public void testIterator() {
Iterator<Course> it = meal.iterator();
assertTrue(it.hasNext());
assertEquals(c1, it.next());
assertTrue(it.hasNext());
assertEquals(c2, it.next());
assertFalse(it.hasNext());
} |
For å teste findCourse-metoden, så må en lage seg et Predicate-objekt og sjekke at findCourse-metoden returnerer det riktige objektet. Code Block |
---|
public void testFindCourse() {
assertEquals(c1, meal.findCourse(course -> course.name.equals("c1")));
} | |
Koden finnes på github, se del 4 av konten 2017 |