10. Test Method Body
Gerard Meszaros:
„When it is not important for something to be seen in the test method, it is important that it not be seen in the test method! “
11. “In the order form the user should be able to finish the order process by pressing the cancel button”
12. @Test public void cancelProcess_inOrderForm() {
server.runningProcesses(0);
ProcessStatus process = server.startProcess(Process.ORDER);
processInstanceId = process.getInstanceId();
server.runningProcesses(1);
server.expectUserForm(processInstanceId, ORDER_FORM);
Form form = new Form();
form.setOrderDate("01.01.2015");
form.setStandardDelivery(false);
String taskId = server.taskIdFor(processInstanceId);
controller.submit(form,
Mockito.mock(BindingResult.class), null,
taskId, null, CANCEL);
server.runningProcesses(0);
}
“In the order form the user should be able to finish the order process by pressing the cancel button”
13. @Test public void cancelProcess_inOrderForm() {
server.runningProcesses(0);
ProcessStatus process = server.startProcess(Process.ORDER);
processInstanceId = process.getInstanceId();
server.runningProcesses(1);
server.expectUserForm(processInstanceId, ORDER_FORM);
Form form = new Form();
form.setOrderDate("01.01.2015");
form.setStandardDelivery(false);
String taskId = server.taskIdFor(processInstanceId);
controller.submit(form,
Mockito.mock(BindingResult.class), null,
taskId, null, CANCEL);
server.runningProcesses(0);
}
“In the order form the user should be able to finish the order process by pressing the cancel button”
„Testscript“
“Incidental Details”
14. @Test public void cancelProcess_inOrderForm() {
server.runningProcesses(0);
ProcessStatus process = server.stareProcess(Process.ORDER);
processInstanceId = process.getInstanceId();
server.runningProcesses(1);
server.expectUserForm(processInstanceId, ORDER_FORM);
Form form = new Form();
form.setOrderDate("01.01.2015");
form.setStandardDelivery(false);
String taskId = server.taskIdFor(processInstanceId);
controller.submit(form,
Mockito.mock(BindingResult.class), null,
taskId, null, CANCEL);
server.runningProcesses(0);
}
FORM
CANCEL
Signal-Noise-Ratio?
Single Level of Abstraction?
“In the order form the user should be able to finish the order process by pressing the cancel button”
15. @Test public void cancelProcess_inOrderForm() {
inForm(ORDER_FORM);
submitFormWithButton(CANCEL);
noProcessRunning();
}
“In the order form the user should be able to finish the order process by pressing the cancel button”
17. Test class names
public class AnOrderProcess {
OrderProcess process;
@Before public void createOrderProcess() {
process = new OrderProcess();
}
object under test
18. public class AnOrderProcess {
OrderProcess process;
@Before public void createOrderProcess() {
process = new OrderProcess();
}
@Test public void inOrderForm_cancel() {
process.setState(ORDER_FORM);
process.submit(CANCEL_BUTTON);
assertThat("process canceled", process.isCanceled(), equalTo(true));
}
Test method names
object under test
19. public class AnOrderProcess {
OrderProcess process;
@Before public void createOrderProcess() {
process = new OrderProcess();
}
@Test public void inOrderForm_cancel() {
process.setState(ORDER_FORM);
process.submit(CANCEL_BUTTON);
assertThat("process canceled", process.isCanceled(), equalTo(true));
}
Test method names
object under test
setup
20. @Before public void createOrderProcess() {
process = new OrderProcess();
}
@Test public void inOrderForm_cancel() {
process.setState(ORDER_FORM);
process.submit(CANCEL_BUTTON);
assertThat("process canceled", process.isCanceled(), equalTo(true));
}
Test method names
setup
execute
21. @Before public void createOrderProcess() {
process = new OrderProcess();
}
@Test public void inOrderForm_cancel() {
process.setState(ORDER_FORM);
process.submit(CANCEL_BUTTON);
assertThat("process canceled", process.isCanceled(), equalTo(true));
}
Test method names
setup
execute
verify
25. Hierarchical tests
public class AnOrderProcess {
@Before public void createOrderProcess() {
process = new OrderProcess();
}
public class InOrderForm {
@Before public void inOrderForm() {
process.setState(ORDER_FORM);
}
@Test public void whenCanceled_processIsStopped() {
process.submit(CANCEL_BUTTON);
assertThat("process stopped", process.isStopped(), equalTo(true));
}
@Test public void whenBought_orderIsConfirmed() {
process.submit(BUY_NOW_BUTTON);
assertThat("state", process.getState(), equalTo(ORDER_CONFIRMED));
}
}
…
extract common
setup
34. Resources
Books
„Clean Code“, Robert C. Martin
„xUnit Test Patterns“, Gerard Meszaros
„Effective Unittesting“, Lasse Koskela
„Growing Object Oriented Software“, Steve Freeman, Nat Pryce
„Specification by Example”, Gojko Adzic
Videos
Episodes 20-22 http://cleancoders.com/,
Robert C. Martin
35. David Völkel
codecentric AG
Twitter: @davidvoelkel
david.voelkel@codecentric.de
www.codecentric.de
blog.codecentric.de
Q&A
35