Exercise 1: Saying Hello

Geschrieben werden sollte ein parametrisiertes „Hello World!“ – Programm mit der Variation unterschiedlicher Begrüßungen für unterschiedliche Namen.

Natürlich habe ich meinen Code testgetrieben entwickelt und damit ich auch was zu lernen und üben habe, verwende ich hier bereits JUnit 5 als zugrundeliegendes Framework.
Ihr seht hier den Test:

package de.mike.kata.exercices;

// For assertions
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
// For asserting Stdout and mocking Stdin
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
// JUnit 5 API
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
// For "incompatibility" of Eclipse with JUnit5
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
class Exercise1Test {
	
	private InputStream stdin;
	private ByteArrayOutputStream stdout;

	@BeforeEach
	void prepareStdIn() {
		stdin = System.in;
		stdout = new ByteArrayOutputStream();
		System.setOut(new PrintStream(stdout));
	}
	
	@Test
	@DisplayName("If name is a single string use casual form of greeting.")
	void testSimpleName() throws Exception {
		System.setIn(new ByteArrayInputStream("Brian".getBytes()));
		Exercise1.main(null);

		assertThat(stdout.toString(), is("What is your name? Hello, Brian, nice to meet you!"));
	}

	@Test
	@DisplayName("If name is a more complex string use male polite form of greeting.")
	void testComplexName() throws Exception {
		System.setIn(new ByteArrayInputStream("Brian Butcher".getBytes()));
		Exercise1.main(null);
		
		assertThat(stdout.toString(), is("What is your name? Hello, Mr. Brian Butcher, nice to meet You!"));
	}
	
	@AfterEach
	void resetStadin() {
		System.setIn(stdin);
	}
}

und anschließend die Implementierung:

package de.mike.kata.exercices;

import java.io.IOException;
import java.util.Scanner;

public class Exercise1 {
	
	public static void main(String[] args) throws IOException {
		callForName();
		greetings();
	}

	private static void greetings() throws IOException {
		Scanner scanner = new Scanner(System.in);
		String name = scanner.nextLine();
		if (isFirstAndLastname(name)) {
			politeFormOfGreeting(name);
		} else {
			casualFormOfGreeting(name);
		}
		scanner.close();
	}

	private static void casualFormOfGreeting(String name) {
		System.out.printf("Hello, %s, nice to meet you!", name);
	}

	private static void politeFormOfGreeting(String name) {
		System.out.printf("Hello, Mr. %s, nice to meet You!", name);
	}

	private static boolean isFirstAndLastname(String name) {
		return name.contains(" ");
	}

	private static void callForName() {
		System.out.print("What is your name? ");
	}

}

Ich gehe mal davon aus, dass mir von niemandem ein Strick daraus gedreht wird, dass ich bei komplexen Namen automatisch die männliche Höflichkeitsform verwendet habe, aber bevor es zu politischen Diskussionen kommt, ändere ich den Code.

Ansonsten habe ich – entgegen meiner Prämisse – das Programm komplett mit statischen Methoden implementiert, was mir natürlich von EclEmma in Eclipse gleich „negativ“ angerechnet wird; s. Code Coverage