Skip to content

Instantly share code, notes, and snippets.

@up1
Last active August 29, 2015 17:37
Show Gist options
  • Save up1/117c48d2402f44a19536 to your computer and use it in GitHub Desktop.
Save up1/117c48d2402f44a19536 to your computer and use it in GitHub Desktop.
FizzBuzz with Dependency Injection
public class CowBoyFizzBuzz {
public static void main(String[] args) {
for (int number = 1; number <= 100; number++) {
if (number % 15 == 0) {
System.out.println("FizzBuzz");
} else if (number % 5 == 0) {
System.out.println("Buzz");
} else if (number % 3 == 0) {
System.out.println("Fizz");
} else {
System.out.println(number);
}
}
}
}
public class FizzBuzzDITest {
private boolean isCalled = false;
@Mock
TextProvider textProvider;
@Mock
Printer printer;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void getNumbersFromNumberProvider() throws Exception {
MyFizzBuzz myFizzBuzz = new MyFizzBuzz();
myFizzBuzz.setNumberProvider(new NumberProvider() {
public Stream<Integer> getNumbers() {
isCalled = true;
return IntStream.rangeClosed(1, 3).boxed();
}
});
myFizzBuzz.setTextProvider(textProvider);
myFizzBuzz.setPrinter(printer);
myFizzBuzz.startProcess();
assertTrue(isCalled);
}
}
public class FizzBuzzDITest {
private boolean isCalled = false;
@Mock
TextProvider textProvider;
@Mock
Printer printer;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void generatedMessage() {
MyFizzBuzz myFizzBuzz = new MyFizzBuzz();
myFizzBuzz.setNumberProvider(new NumberProvider() {
public Stream<Integer> getNumbers() {
return IntStream.rangeClosed(1, 3).boxed();
}
});
myFizzBuzz.setTextProvider(textProvider);
myFizzBuzz.setPrinter(printer);
myFizzBuzz.startProcess();
InOrder order = Mockito.inOrder(textProvider);
order.verify(textProvider).getText(1);
order.verify(textProvider).getText(2);
order.verify(textProvider).getText(3);
}
}
public class FizzBuzzDITest {
private boolean isCalled = false;
@Mock
TextProvider textProvider;
@Mock
Printer printer;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void printedMessage() {
MyFizzBuzz myFizzBuzz = new MyFizzBuzz();
myFizzBuzz.setNumberProvider(new NumberProvider() {
public Stream<Integer> getNumbers() {
return IntStream.rangeClosed(1, 3).boxed();
}
});
myFizzBuzz.setTextProvider(new TextProvider(){
public String getText(int number) {
return "xx" + String.valueOf(number);
}
});
myFizzBuzz.setPrinter(printer);
myFizzBuzz.startProcess();
InOrder order = Mockito.inOrder(printer);
order.verify(printer).print("xx1");
order.verify(printer).print("xx2");
order.verify(printer).print("xx3");
}
}
public class MyFizzBuzz {
private NumberProvider numberProvider;
private TextProvider textProvider;
private Printer printer;
public void setNumberProvider(NumberProvider numberProvider) {
this.numberProvider = numberProvider;
}
public void setTextProvider(TextProvider textProvider) {
this.textProvider = textProvider;
}
public void startProcess() {
this.numberProvider.getNumbers();
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
public class MyFizzBuzz {
private NumberProvider numberProvider;
private TextProvider textProvider;
private Printer printer;
public void setNumberProvider(NumberProvider numberProvider) {
this.numberProvider = numberProvider;
}
public void setTextProvider(TextProvider textProvider) {
this.textProvider = textProvider;
}
public void startProcess() {
this.numberProvider.getNumbers().forEach( number-> {
this.textProvider.getText(number);
});
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
public class MyFizzBuzz {
private NumberProvider numberProvider;
private TextProvider textProvider;
private Printer printer;
public void setNumberProvider(NumberProvider numberProvider) {
this.numberProvider = numberProvider;
}
public void setTextProvider(TextProvider textProvider) {
this.textProvider = textProvider;
}
public void startProcess() {
this.numberProvider.getNumbers().forEach( number-> {
String message = this.textProvider.getText(number);
this.printer.print(message);
});
}
public void setPrinter(Printer printer) {
this.printer = printer;
}
}
public class NumberProvider {
public Stream<Integer> getNumbers() {
return IntStream.rangeClosed(1, 100).boxed();
}
}
public class NumberProviderTest {
@Test
public void numberStartWithOne() {
NumberProvider numberProvider = new NumberProvider();
Stream<Integer> numbers = numberProvider.getNumbers();
assertEquals(1, numbers.findFirst().get().intValue());
}
@Test
public void checkSize() {
NumberProvider numberProvider = new NumberProvider();
Stream<Integer> numbers = numberProvider.getNumbers();
assertTrue(numbers.count() == 100);
}
}
public class Printer {
public void print(String message) {
System.out.println(message);
}
}
public class PrinterTest {
@Test
public void printMessageToConsole() {
String message = "1";
Printer printer = new Printer();
ByteArrayOutputStream expectedOutput = new ByteArrayOutputStream();
System.setOut(new PrintStream(expectedOutput));
printer.print(message);
assertEquals(expectedOutput.toString().trim(), message);
}
}
public class TextProvider {
public String getText(int number) {
if(dividable(number, 15)) {
return "FizzBuzz";
}
if(dividable(number, 3)) {
return "Fizz";
}
if(dividable(number, 5)) {
return "Buzz";
}
return String.valueOf(number);
}
private boolean dividable(int number, int divider) {
return number % divider == 0;
}
}
public class TextProviderTest {
@Test
public void sameInput() {
TextProvider textProvider = new TextProvider();
String actualResult = textProvider.getText(1);
assertEquals("1", actualResult);
}
@Test
public void devideByThreeShouldBeFizz() {
TextProvider textProvider = new TextProvider();
String actualResult = textProvider.getText(3);
assertEquals("Fizz", actualResult);
}
@Test
public void devideByFiveShouldBeBuzz() {
TextProvider textProvider = new TextProvider();
String actualResult = textProvider.getText(5);
assertEquals("Buzz", actualResult);
}
@Test
public void devideByThreeAndFiveShouldBeFizzBuzz() {
TextProvider textProvider = new TextProvider();
String actualResult = textProvider.getText(15);
assertEquals("FizzBuzz", actualResult);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment